Mein MusikPlayer macht nicht, was er soll

Erstmal die Codes:
Die GUI (mit einem GUIBuilder gemacht, da ich gerade keine Lust hatte, das alles selber zu machen :stuck_out_tongue:


import java.awt.Color;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class MusikPlayer extends javax.swing.JFrame {

    /**
     * Creates new form MusikPlayer
     */
    public MusikPlayer() {
        listModel = new DefaultListModel<>();
        initComponents();
        initList();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane2 = new javax.swing.JScrollPane();
        musikDateienListe = new javax.swing.JList();
        beendenButton = new javax.swing.JButton();
        listeLeerenButton = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        datei√Ėffnen = new javax.swing.JMenuItem();
        mehrereDateien = new javax.swing.JMenuItem();
        ordner√Ėffnen = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        beendenMenu = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenu3 = new javax.swing.JMenu();
        jMenu4 = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("MusikPlayer");

        musikDateienListe.setModel(listModel);
        jScrollPane2.setViewportView(musikDateienListe);

        beendenButton.setText("Beenden");
        beendenButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                beendenButtonActionPerformed(evt);
            }
        });

        listeLeerenButton.setText("Liste leeren");
        listeLeerenButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                listeLeerenButtonActionPerformed(evt);
            }
        });

        jMenuBar1.setBorder(new LineBorder(Color.BLACK));

        jMenu1.setText("Datei");

        datei√Ėffnen.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        datei√Ėffnen.setText(" Datei √∂ffnen");
        datei√Ėffnen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                datei√ĖffnenActionPerformed(evt);
            }
        });
        jMenu1.add(datei√Ėffnen);

        mehrereDateien.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        mehrereDateien.setText("Mehrere Dateien öffnen");
        mehrereDateien.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mehrereDateienActionPerformed(evt);
            }
        });
        jMenu1.add(mehrereDateien);

        ordner√Ėffnen.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.ALT_MASK));
        ordner√Ėffnen.setText("Ganzen Ordner √∂ffnen");
        ordner√Ėffnen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ordner√ĖffnenActionPerformed(evt);
            }
        });
        jMenu1.add(ordner√Ėffnen);
        jMenu1.add(jSeparator1);

        beendenMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK));
        beendenMenu.setText("Beenden");
        beendenMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                beendenMenuActionPerformed(evt);
            }
        });
        jMenu1.add(beendenMenu);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Einstellungen");
        jMenuBar1.add(jMenu2);

        jMenu3.setText("Ansicht");
        jMenuBar1.add(jMenu3);

        jMenu4.setText("Hilfe");
        jMenuBar1.add(jMenu4);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 462, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(beendenButton, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(listeLeerenButton, javax.swing.GroupLayout.Alignment.TRAILING))))
                .addContainerGap())
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {beendenButton, listeLeerenButton});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(27, 27, 27)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)
                .addGap(5, 5, 5)
                .addComponent(listeLeerenButton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(beendenButton)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void beendenButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        System.exit(0);
    }                                             

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    private void ordner√ĖffnenActionPerformed(java.awt.event.ActionEvent evt) {                                             
//        if (Musik.isPlaying) {
//            Musik.player.close();
//            Musik.isPlaying = false;
//            MusikThread.audioFiles = null;
//        }
        new Musik(false, true);
    }                                            

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    private void mehrereDateienActionPerformed(java.awt.event.ActionEvent evt) {                                               
//        if (Musik.isPlaying) {
//            Musik.player.close();
//            Musik.isPlaying = false;
//            MusikThread.audioFiles = null;
//        }
        new Musik(true, false);
    }                                              

    private void beendenMenuActionPerformed(java.awt.event.ActionEvent evt) {                                            
        System.exit(0);
    }                                           

   

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    private void datei√ĖffnenActionPerformed(java.awt.event.ActionEvent evt) {                                            
        new Musik(false, false);
    }                                           

    private void listeLeerenButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        listModel.clear();
    }                                                 

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MusikPlayer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MusikPlayer().setVisible(true);
            }
        });
    }
    static DefaultListModel<File> listModel;
    // Variables declaration - do not modify                     
    private javax.swing.JButton beendenButton;
    private javax.swing.JMenuItem beendenMenu;
    private javax.swing.JMenuItem datei√Ėffnen;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JButton listeLeerenButton;
    private javax.swing.JMenuItem mehrereDateien;
    static javax.swing.JList musikDateienListe;
    private javax.swing.JMenuItem ordner√Ėffnen;
    // End of variables declaration                   

    private void initList() {
        musikDateienListe.addListSelectionListener(new ListSelectionListener() {

            @Override
            @SuppressWarnings("ResultOfObjectAllocationIgnored")
            public void valueChanged(ListSelectionEvent lse) {
//                Musik.player.close();
//                File[] newAudioFiles = MusikThread.audioFiles;
//                MusikThread.audioFiles = null;
//                try {
//                    Musik.player = new Player(new FileInputStream((File) musikDateienListe.getSelectedValue()));
//                    Musik.player.play();
//                    MusikThread.audioFiles = newAudioFiles;
//                } catch (JavaLayerException | FileNotFoundException ex) {
//                    Logger.getLogger(MusikPlayer.class.getName()).log(Level.SEVERE, null, ex);
//                }
                new ListThread();
            }
        });
    }
}

Der Player + das ganze Auswahl-Gedöns:


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javazoom.jl.decoder.*;
import javazoom.jl.player.Player;

public class Musik implements Runnable {

    FileInputStream inputStream;
    static Player player;
    static boolean isPlaying = false;
    static Thread t = new Thread(new Musik());

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    public Musik(boolean multiSelection, boolean onlyDirectories) {
        t.setName("Musik");
        JFileChooser musikChooser = new JFileChooser();
        File startFile = new File("E:\\Metin2\\");
        musikChooser.removeChoosableFileFilter(musikChooser.getFileFilter());
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Unterst√ľtzte Musik-Formate", "wav", "mp3");
        musikChooser.setFileFilter(filter);
        musikChooser.setCurrentDirectory(startFile);
        musikChooser.setMultiSelectionEnabled(multiSelection);
        if (onlyDirectories) {
            musikChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        }
        int returnVal = musikChooser.showDialog(musikChooser, "MusikTrack wählen");
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            if (!onlyDirectories) {
                if (multiSelection) {
                    File[] audioFiles = musikChooser.getSelectedFiles();
                    for (File audioFile : audioFiles) {
                        MusikPlayer.listModel.addElement(audioFile);
                    }
                    if (MusikThread.audioFiles == null) {
                        new MusikThread(audioFiles);
                    } else {
                        File[] oldFiles = MusikThread.audioFiles;
                        File[] newFiles = audioFiles;
                        int newLength = oldFiles.length + newFiles.length;
                        File[] resultFiles;
                        resultFiles = Arrays.copyOf(oldFiles, newLength);
                        System.arraycopy(newFiles, 0, resultFiles, oldFiles.length, newFiles.length);
                        MusikThread.setAudioFiles(resultFiles);
                    }

                } else {
                    File newAudioFile = musikChooser.getSelectedFile();
                    MusikPlayer.listModel.addElement(newAudioFile);

                    if (MusikThread.audioFiles == null) {
                        new MusikThread(newAudioFile);
                    } else {
                        File[] oldFiles = MusikThread.audioFiles;
                        File[] newFile = {newAudioFile};
                        int newLength = oldFiles.length + newFile.length;
                        File[] resultFiles;
                        resultFiles = Arrays.copyOf(oldFiles, newLength);
                        System.arraycopy(newFile, 0, resultFiles, oldFiles.length, newFile.length);
                        MusikThread.setAudioFiles(resultFiles);
                    }
                }
            } else {
                File[] audioFiles = musikChooser.getSelectedFile().listFiles();
                for (File audioFile : audioFiles) {
                    MusikPlayer.listModel.addElement(audioFile);
                }
                if (MusikThread.audioFiles == null) {
                    new MusikThread(audioFiles);
                } else {
                    File[] oldFiles = MusikThread.audioFiles;
                    File[] newFiles = audioFiles;
                    int newLength = oldFiles.length + newFiles.length;
                    File[] resultFiles = Arrays.copyOf(oldFiles, newLength);
                    System.arraycopy(newFiles, 0, resultFiles, oldFiles.length, newFiles.length);
                    MusikThread.setAudioFiles(resultFiles);
                }
            }

        }
    }

    Musik() {
    }

    @Override
    public void run() {
        try {
            if (!isPlaying) {
                if (!ListThread.isListThreading) {
                    System.out.println("Starte Lied");
                    isPlaying = true;
                    player.play();
                    isPlaying = false;
                    System.out.println("Lied zuende");
                }
            }
        } catch (JavaLayerException ex) {
            FileHandler fh = null;
            try {
                fh = new FileHandler("syserr.xml.log");
            } catch (IOException ex1) {
                System.err.println("Filehandler bei Musik kaputt");
            }
            Logger log = Logger.getLogger(Musik.class.getName());
            log.addHandler(fh);
            log.log(Level.SEVERE, null, ex);
        }
    }
}```
```package MusikPlayer;

import static MusikPlayer.Musik.isPlaying;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class MusikThread implements Runnable {

    FileInputStream inputStream;
    static File[] audioFiles;
    Thread t = new Thread(this);

    public MusikThread(File... audioFiles) {
        MusikThread.audioFiles = audioFiles;
        t.start();
    }

    public static void setAudioFiles(File[] audioFiles) {
        MusikThread.audioFiles = audioFiles;
    }

    @Override
    public void run() {
        for (File audioFile : audioFiles) {
            try {
                if (!isPlaying) {
                    t = new Thread(this);
                    t.setName("MusikThread");
                    Musik.t = new Thread(new Musik());
                    inputStream = new FileInputStream(audioFile);
                    System.out.println("InputStream gesetzt");
                    Musik.player = new Player(inputStream);
                    Musik.t.start();
                    Musik.t.join();
                    ListThread.t.join();
                    if (audioFiles == null) {
                        System.out.println("For-Schleife abgebrochen");
                        break;
                    }
                }
            } catch (FileNotFoundException | JavaLayerException | InterruptedException ex) {
                FileHandler fh = null;
                try {
                    fh = new FileHandler("syserr.xml.log");
                } catch (IOException ex1) {
                    System.err.println("Filehandler bei Musik kaputt");
                }
                Logger log = Logger.getLogger(MusikThread.class.getName());
                log.addHandler(fh);
                log.log(Level.SEVERE, null, ex);
            }
            System.out.println("For-Schleife beendet");
        }
    }
}

Die Liste mit den ganzen Dateien als Thread:


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class ListThread implements Runnable {

    static Thread t;
    static boolean isListThreading = false;

    public ListThread() {
        t = new Thread(new ListThread(true));
        t.setName("ListThread");
        t.start();
    }

    public ListThread(boolean useless) {
    }
    
    

    @Override
    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    public void run() {
        System.out.println("Musikplayer im ListThread geschlossen");
        Musik.player.close();
        File[] newAudioFiles = MusikThread.audioFiles;
        MusikThread.audioFiles = null;
        isListThreading = true;
        try {
System.out.println("Im Try bei ListThread");
            Musik.player = new Player(new FileInputStream((File) MusikPlayer.musikDateienListe.getSelectedValue()));
            Musik.player.play();
            MusikThread.audioFiles = newAudioFiles;
            Musik.player.close();
            new MusikThread(newAudioFiles);
            System.out.println("ListThread fertig");
            } catch (JavaLayerException | FileNotFoundException ex) {
            Logger.getLogger(ListThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

So und nun zur Problembeschreibung:
Ich starte das Programm, alles Wunderbar
Ich wähle ein paar Lieder/nen Ordner/eine Datei aus, alles gut und er spielt das erste ab. Ausgabe hier:

InputStream gesetzt
Starte Lied

Dann wähle ich in der Liste ein anderes aus, er unterbricht das letzte und spielt das ausgewählte ab. Auch alles super. Ausgabe hier:

InputStream gesetzt
Starte Lied
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Im Try bei ListThread
Lied zuende

(warum ist das hier eig jeweils 2x drin?)

Und jetzt kommt das Problem:
Wenn ich wieder ein anderes Lied auswähle, spielt er das neue UND das aktuelle gleichzeitig ab. Ausgabe hier:

InputStream gesetzt
Starte Lied
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Im Try bei ListThread
Lied zuende
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Exception in thread ‚ÄěThread-11‚Äú java.lang.NullPointerException
ListThread fertig
at MusikPlayer.MusikThread.run(MusikThread.java:31)
For-Schleife abgebrochen
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄěThread-13‚Äú java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)

(Neuer Post, weil 3008 Zeichen zuviel)

Und das versteh ich einfach nicht, wie ich das lösen kann. Da ich langsam aber sicher die Lust daran verliere, da es einfach nicht funzt, meld ich mich hier nochmal.

Wenn ich aber warte bis beide Lieder vorbei sind und wieder ein neues auswähle, kommen wieder Exceptions, aber er spielt es ab:

Ausgabe:
[spoiler]

InputStream gesetzt
Starte Lied
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Im Try bei ListThread
Lied zuende
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Exception in thread ‚ÄúThread-11‚ÄĚ java.lang.NullPointerException
ListThread fertig
at MusikPlayer.MusikThread.run(MusikThread.java:31)
For-Schleife abgebrochen
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-13‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
ListThread fertig
ListThread fertig
Exception in thread ‚ÄúThread-15‚ÄĚ Exception in thread ‚ÄúThread-14‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-18‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
[/spoiler]

Und wenn ich jetzt ein anderes Lied auswähle, stoppt er das alte und spielt das neue ab. Das kann ich noch 2x machen und dann spielt er wieder 2 gleichzeitig ab. Dann schaut die Ausgabe so aus:

Ausgabe:
[spoiler]

InputStream gesetzt
Starte Lied
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Im Try bei ListThread
Lied zuende
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Exception in thread ‚ÄúThread-11‚ÄĚ java.lang.NullPointerException
ListThread fertig
at MusikPlayer.MusikThread.run(MusikThread.java:31)
For-Schleife abgebrochen
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-13‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
ListThread fertig
ListThread fertig
Exception in thread ‚ÄúThread-15‚ÄĚ Exception in thread ‚ÄúThread-14‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-18‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Exception in thread ‚ÄúThread-20‚ÄĚ java.lang.NullPointerException
ListThread fertig
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-22‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-25‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Exception in thread ‚ÄúThread-28‚ÄĚ java.lang.NullPointerException
Im Try bei ListThread
at MusikPlayer.MusikThread.run(MusikThread.java:31)
ListThread fertig
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-30‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-32‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-34‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-36‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-38‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
Exception in thread ‚ÄúThread-40‚ÄĚ java.lang.NullPointerException
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Exception in thread ‚ÄúThread-43‚ÄĚ java.lang.NullPointerException
Im Try bei ListThread
ListThread fertig
at MusikPlayer.MusikThread.run(MusikThread.java:31)
at java.lang.Thread.run(Thread.java:724)
[/spoiler]

Und das versteh ich nicht, jemand ne Idee, oder blamier ich mich grad total?

Edit: Damit ihr euch nicht komplett durch den GuiBuilder generierten Code w√ľhlen m√ľsst, die denke ich relevantesten Stellen:


private void initList() {
        musikDateienListe.addListSelectionListener(new ListSelectionListener() {

            @Override
            @SuppressWarnings("ResultOfObjectAllocationIgnored")
            public void valueChanged(ListSelectionEvent lse) {
//                Musik.player.close();
//                File[] newAudioFiles = MusikThread.audioFiles;
//                MusikThread.audioFiles = null;
//                try {
//                    Musik.player = new Player(new FileInputStream((File) musikDateienListe.getSelectedValue()));
//                    Musik.player.play();
//                    MusikThread.audioFiles = newAudioFiles;
//                } catch (JavaLayerException | FileNotFoundException ex) {
//                    Logger.getLogger(MusikPlayer.class.getName()).log(Level.SEVERE, null, ex);
//                }
                new ListThread();
            }
        });
    }```

```    private void beendenButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        System.exit(0);
    }                                             

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    private void ordner√ĖffnenActionPerformed(java.awt.event.ActionEvent evt) {                                             
//        if (Musik.isPlaying) {
//            Musik.player.close();
//            Musik.isPlaying = false;
//            MusikThread.audioFiles = null;
//        }
        new Musik(false, true);
    }                                            

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    private void mehrereDateienActionPerformed(java.awt.event.ActionEvent evt) {                                               
//        if (Musik.isPlaying) {
//            Musik.player.close();
//            Musik.isPlaying = false;
//            MusikThread.audioFiles = null;
//        }
        new Musik(true, false);
    }                                              

    private void beendenMenuActionPerformed(java.awt.event.ActionEvent evt) {                                            
        System.exit(0);
    }                                           

   

    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    private void datei√ĖffnenActionPerformed(java.awt.event.ActionEvent evt) {                                            
        new Musik(false, false);
    }                                           

    private void listeLeerenButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        listModel.clear();
    }  ```

Habe den Code nicht wirklich angeschaut, daher erst mal ein Hinweis:
Du musst Dir bewusst sein, dass die ListSelectionListener Methode valueChanged bei der Deselektion des alten Eintrags und bei der Selektion des neuen Eintrags - also immer zweimal - aufgerufen wird. Daher solltest Du auch immer mit der entsprechenden Event Methode getValueIsAdjusting() pr√ľfen, ob das Event aufgrund der Selektion geworfen wurde und nur dann das Abspielen starten. vgl How to Use Lists

Wenn ich das mache, kommt anstatt der nullpointer ne IllegalThreadStateException. Dann kann ich zwar weitere Lieder auswählen, aber Er spielt dann alle gleichzeitig ab.
Ausgabe:

InputStream gesetzt
Starte Lied
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Lied zuende
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
For-Schleife beendet
InputStream gesetzt
InputStream gesetzt
Exception in thread ‚ÄúThread-10‚ÄĚ java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:684)
at MusikPlayer.MusikThread.run(MusikThread.java:41)
at java.lang.Thread.run(Thread.java:724)
Musikplayer im ListThread geschlossen
Im Try bei ListThread
Musikplayer im ListThread geschlossen
Im Try bei ListThread
ListThread fertig
InputStream gesetzt
Musikplayer im ListThread geschlossen
Im Try bei ListThread

Aber ich dachte die Exception wird nur geworfen, wenn ich einen nicht existenten Thread starten will? Der wird doch aber 5 Zeilen dr√ľber erzeugt mit new Thread(new Musik());

static File[] audioFiles;
…
public static void setAudioFiles(File[] audioFiles) {
MusikThread.audioFiles = audioFiles;
}

Das ist wohl ein Problem… kannst so nicht im Multithread Environment arbeiten, musst die Threads synchronisieren.
Setzt mal ein synchronized vor die Methode.
Das ist aber bei den anderen statischen Varibalen auch nicht anders.

Und wie synchronisiere ich Variablen? Weil das synchronized ums main und die Methode da allein löst das ganze nicht.

F√ľr meinen Geschmack ist da viel zu viel ‚Äústatic‚ÄĚ enthalten, und es werden scheinbar wahllos Objekte allgemein und speziell Threads erzeugt und gestartet. Von √ľberall auf irgendwas zugegriffen. Ich kann da keine klare Struktur erkennen.
Das ganze scheint irgendwie grunds√§tzlich nicht zu passen. Ich w√ľrde da mal ganz klein anfangen, evtl. sogar ohne GUI einfach nur die Funktionalit√§t Audio Files abzuspielen und zu stoppen.

W√ľrde auch erst zu kleinen Schritten raten und solltest dich erst mit Multiithreading auseinandersetzten bevor du drauflos programmierst.

Hier ist IMHO ein guter Startpunkt: http://www.angelikalanger.com/Articles/EffectiveJava/12.MT-Basics/12.MT-Basics.html

Angelika Langer hat viele Gute Artikel zu diesem Thema: http://www.angelikalanger.com/Articles/Topics.html#ConcurrentJava

Habs hingekriegt.
Aber noch ne andere Frage, wenn ich ja ein Lied ausw√§hle, spielt er es ab und dann passiert gar nichts mehr. Da ich mir darum erstmal keinen Kopf machen will, lass ich das erstmal so. Aber ich will noch einen Button hinzuf√ľgen, der die komplette Liste in ein File-Array packt und dann ganz normal von oben nach unten abspielt. Aber warum funktioniert das nicht? Die Files gibt er alle auf der Konsole aus, so wies soll, aber er macht einfach GAR NIX mehr.

        listModel.copyInto(listElements);
        new MusikThread(listElements);
        for (File file : listElements) {
        System.out.println(file);
        }```
Der Aufruf an MusikThread ist ja der gleiche wie direkt am Anfang bei der Auswahl am Anfang und da tut ers doch auch.