Nach abspielen von Sound reagiert das Program nichtmehr

Diskutiere Nach abspielen von Sound reagiert das Program nichtmehr im AWT, Swing, JavaFX & SWT Bereich.
VPChief

VPChief

Hallo,

Ich habe diesmal Folgendes Problem:

Ich Spiele einen Sound ab, Und wenn ich dann mein Program wweiter nutzen will oder Schliessen will, ist es wie Tot. Weder Schliessen noch meine MenuBar funktionieren, und das Label, dass ich während der Sound abgespielt wird anzeigen lassen will, wir auch nicht angezeigt. Ich habe ein vermutung woran es liegen könnte, vielleicht dass der Sound nicht mehr geschlossen wird am ende, allerdings habe ich keine lösung wie ich das machen soll, und ie Google beispiele haben mir nur Fehlermeldungen gebracht.

Hier ist noch mein Code


Klasse Class:

Java:
package pack;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.filechooser.FileNameExtensionFilter;


public class Class extends Thread { 
 
    static Clip clip;
    
    @SuppressWarnings("deprecation")
    public static void Run() {
        
        
        JFileChooser fileChooser = new JFileChooser();;    
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Wellenform Audio (.WAV)", "wav");
        FileNameExtensionFilter filter2 = new FileNameExtensionFilter("AIFF Dateien (.AIFF)", "aiff");
        FileNameExtensionFilter filter3 = new FileNameExtensionFilter("AU Dateien (.AU)", "au");
        FileNameExtensionFilter filter4 = new FileNameExtensionFilter("SND Dateien (.SND)", "snd");
        FileNameExtensionFilter filter5 = new FileNameExtensionFilter("MIDI Dateien (.MID)", "mid");
        fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());
        fileChooser.addChoosableFileFilter(filter);    
        fileChooser.addChoosableFileFilter(filter2);    
        fileChooser.addChoosableFileFilter(filter3);    
        fileChooser.addChoosableFileFilter(filter4);    
        fileChooser.addChoosableFileFilter(filter5);    
        
        int returnValue = fileChooser.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
          File selectedFile = fileChooser.getSelectedFile();
          
          PrintWriter writer = null;
          try {
              
        File targetFile = new File(selectedFile, "");


       


        URL url = null;
        try {
            url = new File(""+ targetFile).toURI().toURL();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return;
        }
 

        AudioClip clip = Applet.newAudioClip(url);
        System.out.println("es sollte funktionieren");

        clip.play();
        try {
            Thread.sleep(600000);
        } catch (InterruptedException e) {
            JFrame frame = new JFrame();
            frame.setSize(200,200);
            JLabel label =new JLabel("Ein Problem ist aufgetreten");
            frame.add(label);
            frame.setVisible(true);
        }
        System.out.println(targetFile);
          }  
          finally {
            if (writer != null) {
              writer.flush();
              writer.close();
            }
          }     
        }

      

    }
    

    
}
Klasse Main:


Java:
package pack;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);
        frame.setTitle("Frame");
        setUp(frame);
        frame.setMinimumSize(new Dimension(400,400));

    }

    private static void setUp(JFrame frame) {
        JPanel content = new JPanel();
        JMenuBar menubar = new JMenuBar();
        JMenu Datei = new JMenu( "Datei" );
        JMenuItem öffnen = new JMenuItem("Öffnen");
        öffnen.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Class.Run();
                JLabel label = new JLabel("wird wiedergegeben........");
                content.add(label);
                
            }
            
        });
        Datei.add(öffnen);
        menubar.add(Datei);
        
        frame.setJMenuBar(menubar);
        
        frame.setContentPane(content);
        content.revalidate();
        content.repaint();
        
        
        
    }

}
 
L

LimDul

Als erstes. Der Name "Class" ist so ziemlich der schlechteste Name den man einer Klasse geben kann. Das ist der Namen einer zentrale Klasse aus dem JDK.

uff, da ist Code drin, der falsch ist:

Punkt 1: In dem Event Dispatching Thread darf man nicht anhalten. Das passiert bei dir nicht.
Punkt 2: In eigens erstellten Threads darf man nicht direkt auf Swing Elemente zugreifen, sondern nur mittels SwingUtils.invoke...
Und das ist bei dir falsch. In deiner Run-methode darfst du keine Fenster ezeugen (JFrame, JFileChooser etc.) Ob das die Ursache ist weiß ich nicht.
Aber deine Thread-Klasse sollte nur den Dateinamen bekommen und den abspielen - keine Gui-Aktionen machen.

Und den Frame solltest du erst nach dem initialisieren sichtbar setzen.
 
F

fhoffmann

Und wenn du von Thread erbst, sollte deine Methode run heißen (kleingeschrieben); diese Method rufst du nicht direkt auf, sondern rufst start auf.
 
VPChief

VPChief

So, Danke für eure ratschläge
Punkt 1: In dem Event Dispatching Thread darf man nicht anhalten. Das passiert bei dir nicht.
Punkt 2: In eigens erstellten Threads darf man nicht direkt auf Swing Elemente zugreifen, sondern nur mittels SwingUtils.invoke...
Und das ist bei dir falsch. In deiner Run-methode darfst du keine Fenster ezeugen (JFrame, JFileChooser etc.) Ob das die Ursache ist weiß ich nicht.
Aber deine Thread-Klasse sollte nur den Dateinamen bekommen und den abspielen - keine Gui-Aktionen machen.

Und den Frame solltest du erst nach dem initialisieren sichtbar setzen.
Punkt 1 war ich nicht sicher was gemeint war Punkt zwei bin ich mir nicht sicher ob ich es Richtig gemacht habe, Deshalb noch mein Code:


Klasse Klasse(Umbenannt Wohlgemerkt):

Java:
package pack;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.filechooser.FileNameExtensionFilter;


public class Klasse {

    static Clip clip;
    public static File targetFile;
    @SuppressWarnings("deprecation")
    public static void run() {
      
      
        JFileChooser fileChooser = new JFileChooser();; 
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Wellenform Audio (.WAV)", "wav");
        FileNameExtensionFilter filter2 = new FileNameExtensionFilter("AIFF Dateien (.AIFF)", "aiff");
        FileNameExtensionFilter filter3 = new FileNameExtensionFilter("AU Dateien (.AU)", "au");
        FileNameExtensionFilter filter4 = new FileNameExtensionFilter("SND Dateien (.SND)", "snd");
        FileNameExtensionFilter filter5 = new FileNameExtensionFilter("MIDI Dateien (.MID)", "mid");
        fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());
        fileChooser.addChoosableFileFilter(filter); 
        fileChooser.addChoosableFileFilter(filter2); 
        fileChooser.addChoosableFileFilter(filter3); 
        fileChooser.addChoosableFileFilter(filter4); 
        fileChooser.addChoosableFileFilter(filter5); 
      
        int returnValue = fileChooser.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
          File selectedFile = fileChooser.getSelectedFile();
        
          PrintWriter writer = null;
          try {
            
       targetFile = new File(selectedFile, "");
       Snippet.Sound();

      
        System.out.println(targetFile);
          }
          finally {
            if (writer != null) {
              writer.flush();
              writer.close();
            }
          }   
        }

    

    }
  

  
}

Klasse Main:

Java:
package pack;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setTitle("VP Audio Editor/Viewer");
        setUp(frame);
        frame.setMinimumSize(new Dimension(400,400));
      
    }

    private static void setUp(JFrame frame) {
        JPanel content = new JPanel();
        JMenuBar menubar = new JMenuBar();
        JMenu Datei = new JMenu( "Datei" );
        JMenuItem öffnen = new JMenuItem("Öffnen");
        öffnen.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Klasse.run();
                   // Hier habe ich auch schon Snippet.Sound(); versucht, und die URL in der Klasse Snippet durch eine feste auf meinem Datenträger ersetzt. Hat nicht funktioniert
                  
                JLabel label = new JLabel("wird wiedergegeben........");
                content.add(label);
              
            }
          
        });
        Datei.add(öffnen);
        menubar.add(Datei);
      
        frame.setJMenuBar(menubar);
      
        frame.setContentPane(content);
        content.revalidate();
        content.repaint();
      
      
        frame.setVisible(true);
    }

}
Klasse Snippet:


Java:
package pack;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;



public class Snippet {
  
    @SuppressWarnings("deprecation")
    public static void Sound() {
    URL url = null;
            try {
                url = new File(""+ Klasse.targetFile).toURI().toURL();
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return;
            }
  
            AudioClip clip = Applet.newAudioClip(url);
            System.out.println("es sollte funktionieren");
  
            clip.play();
            try {
                Thread.sleep(600000);
            } catch (InterruptedException e) {
            
            }
}

}

Es hat nichts geändert
 
mrBrown

mrBrown

Ganz genereller Hinweis: GUI (und auch Sound) erst dann, wenn man die Grundlagen drauf hat.


Entfern als erstes mal alle static. static sollte bei dir nur vor der Main-Methode stehen.
Wenn du das geändert hast, kann man sich an den Rest machen.
 
L

LimDul

Ich sehe heute erst, die Klasse wird komplett falsch verwendet. Da ist das static komplett falsch
 
L

LimDul

Gestern am Handy geschrieben, deswegen was das nur so kurz.

Einen neuen Thread startet man nicht mit Klasse.run() sondern man muss ein Thread Objekt erzeugen und da die Start Methode aufrufen. Deswegen kann ich nur das unterstreichen, was @mrBrown gesagt hat. Das ganze statische Zeug und die statischen Methoden müssen weg und es muss mit Objekten gearbeitet werden.
 
VPChief

VPChief

So... ich habe jetzt etwas länger rumproiert, aber habe jetzt beschlossen meine Klasse zu exportieren, und dann extern Starten lassen
also mit Desktop.getDesktop und so.

Vielen Dank euch
 
mihe7

mihe7

Thread hin, Thread her, wenn Du das GUI 5 Minuten lang blockierst, brauchst Du Dich nicht zu wundern, wenn das Programm nicht mehr reagiert :) Mach einfach das Thread.sleep raus.
 
VPChief

VPChief

Vielen Dank @mihe7 , und auch an alle anderen, die Verbesserungsvorschläge hatten.
Jetzt funktioniert es. Das war dumm von mir, dass ich das nicht gesehen hab.:)
 
Thema: 

Nach abspielen von Sound reagiert das Program nichtmehr

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben