Nach abspielen von Sound reagiert das Program nichtmehr

VPChief

VPChief

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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

Bekanntes Mitglied
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

Super-Moderator
Mitarbeiter
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

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

LimDul

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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.:)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
N java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
M Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
M Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing Seltsame Ausgabe nach ButtonClick AWT, Swing, JavaFX & SWT 1
T JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
L Graphik nach 100 ms neu laden AWT, Swing, JavaFX & SWT 1
B Doppelte MenuBar -> Nach Minimieren verschwunden AWT, Swing, JavaFX & SWT 3
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
K Swing JPanel nach oben und links vergrößern AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
J Swing: JFrame nach oben "aufklappen" AWT, Swing, JavaFX & SWT 0
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
G .jar startet nicht nach Exportierung AWT, Swing, JavaFX & SWT 7
P Swing JTable flimmert nach Zellsortierung AWT, Swing, JavaFX & SWT 3
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
Thallius Swing Tabelle nach Datumsspalte sortieren AWT, Swing, JavaFX & SWT 4
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
K Swing Selectedrows falsch nach Sortieren AWT, Swing, JavaFX & SWT 1
A LayoutManager Statusleiste auch nach Verkleinerung des Fensters anzeigen AWT, Swing, JavaFX & SWT 1
I Swing Bilder werden nach Export nicht angezeigt AWT, Swing, JavaFX & SWT 1
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
H JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
P Swing Nach removeAll() noch 1 Element vorhanden AWT, Swing, JavaFX & SWT 0
V Bestellungsverwaltung nach MVC-Standard AWT, Swing, JavaFX & SWT 6
H Java3D, ViewP Translattform soll sich nach einerformgroup richten. AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
B Etwas was nach jedem GUI 'click' ausgeführt wird AWT, Swing, JavaFX & SWT 6
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
M Swing Aktualisieren eines JPanels nach Tasteneingabe AWT, Swing, JavaFX & SWT 2
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben