# Problem mit Threads



## ItzChris (14. Apr 2009)

Also, ich hoff mal das hier ist die richtige Stelle um das Problem zu posten.
Ich versuch grad nen MP3- Player zu programmieren, jetzt bin ich auf ein Problem gestoßen das ich nicht zu lösen weiß. 
Wenn ich ein Lied eingelesen und gestartet habe startet ein Thread der es durchlaufen lässt. Wenn ich aber währen ein Lied am laufen ist, ein 2. Lied auswähle, kann ich den laten Thread nicht mehr beenden. Jetzt frag ich mich ob es vielleicht ne Möglichkeit gibt, alle Threads zu beenden, also wenn ich halt ein 2. Mal auf "Play" drück, das dann alle vorherigen Thread geschlossen werden, da sonst 2 Lieder gleichzeitig abgespielt werde.

Wäre nett wenn mir jemand helfen könnte.


----------



## hdi (15. Apr 2009)

Kannst du mal zeigen wie so ein Thread bei dir aussieht, der ein Lied abspielt?


----------



## ItzChris (15. Apr 2009)

Alles klar:



```
void Abspielen()
  {
//    ThreadStarten();
    try{
      System.out.println(dateipfad);
      p.close();
      demoThread = new startThread();
      running = true;
      demoThread.start();
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad));
      }
      catch(Exception e){}
    }
    catch(Exception e){}
  }
```


```
void ThreadStarten()
  {
    try{
      System.out.println(dateipfad);
      p.close();
      demoThread = new startThread();
      running = true;
      demoThread.start();
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad));
      }
      catch(Exception e){}
    }
    catch(Exception e){}
  }
```


```
class startThread extends Thread{
     public void run(){
       try{
         p.play();
       }
       catch(Exception e){}
     }
   }
```


----------



## hdi (15. Apr 2009)

Wo liegt "p" und "running"? Bzw wo liegen die beiden Methoden, und wieso hast du 2 gleiche Methoden?


----------



## ItzChris (15. Apr 2009)

Hab da bisschen was falsch eingefügt, p und running liegen ganz oben in der public class oder wie meinst du das?

Also running ist ja ne boolean und p ist halt der AdvancedPlayer mit dem ich das abspiele, aber ich glaub ich versteh dich grad falsch..


----------



## 0x7F800000 (15. Apr 2009)

...und wieso schreibst du methodennamen Groß
...und wieso schreibst du klassennamen kLEIN
(hab's eben 5 mal durchlesen müssen, bis ich gerafft hab wo hier oben und unten ist...  diese verdammten groß-kleinschreibungs-weltraumtouristen :lol
...und wieso fängst du nicht spezifizierte Exceptions ab (nicht gut!)
...und wieso postest du nicht einfach die ganze Klasse?
(bei thread stecken die probleme oft nicht in einzelnen zeilen, sondern in der globalen struktur des programms)

UND überhaupt: wie soll hier irgendwas stoppen, wenn ich in keiner einzigen zeile irgendwo ein "stop()" sehe????:L


----------



## ItzChris (15. Apr 2009)

Werd den Code mal bearbeiten, damit mans besser lesen kann..


----------



## hdi (15. Apr 2009)

Ach du scheiße. Um diese Uhrzeit habe ich wirklich nich die Kraft für sowas 

Kurz und knapp:

1) *Schmeiss diese ganzen überflüssigen Tabulatoren raus!!!*
2) Klassennamen beginnen mit grossen Buchstaben, Methoden und Variablen mit kleinen
3) Member-Variablen gehören private
4) Man weist ihnen auch nicht direkt einen Wert zu, das sollte im Konstruktor passieren.

Ansonsten hab ich mir dieses Chaos nicht gedrückt, nur eine Sache is mir spontan aufgefallen: Das "p" ist eine globale Variable. Nachdem du den Thread startest weisst du der ein neues Objekt zu, und der gestartete Thread wird auf dem neuen Objekt weiterarbeiten. Ich glaube nicht dass du das so geplant hast?

...änder bitte erstmal den...dieses..._Kunstwerk_  So codet man nicht.


----------



## 0x7F800000 (15. Apr 2009)

ItzChris hat gesagt.:


> Hmk, sry für Groß- und Kleinschreibung habs mir so angewohnt..


Ist doch keine "Gewöhnungssache". Wenn du in Java schreibst, dann schreib eben in java... Woanders schreibst du eben irgendwie anders... In java ist es eben üblich Klassennamen Groß und methodennamen klein zu schreiben, da gibt's nichts anzugewöhnen oder abzugewöhnen: mach's einfach.

Okay, also, mit dem code ist es schon ein klein wenig verständlicher... aber nicht so wirklich, um ehrlich zu sein....

```
class startThread extends Thread{
     public void run(){
       try{
         p.play();
       }
       catch(Exception e){}
     }
   }
```
Was soll diese Konstruktion für einen Sinn haben? Böse Dämonen abschrecken? 
Das ist doch irgendwie ein total untreadiges Verhalten, wenn ein thread erzeugt wird, nur um eine einzige methode aufzurufen und sofort wieder zu verrecken... 

Ebenso unkalr ist, was du hier vorhattest:

```
void Stop()
  {
    if(running){
      demoThread = null;
    }
    running = false;
    p.close();
  }
```
wozu setzst du den thread auf null? der ist bis dahin doch eh schon lange tot, wen interessiert diese referenz?

p.close() sollte dagegen schon das stoppen bewirken. Tut es das nicht? Dann ist es seltsam... :bahnhof:

 Ich würde aber zunächst mal vorschlagen, diese merkwürdige "startThread"-Klasse herauszuschneiden [bzw eine erklärung zu liefern, wozu sie gut sein soll], und alles andere schnell zu refactorn... Und überhaupt, beschreibe das Problem etwas konkreter. Kompilieren kann ich den kram immer noch nicht, weil ich mir dieses paket grad nicht runterladen will...


----------



## ItzChris (15. Apr 2009)

K, bevor ich ds hier programmiert hatte, habe ich noch nie was mit Threads gemacht und ich hatte es so gefunden und hab das deswegen auch so gemacht.
Ist jetzt keine Entschuldigung aber naja.

Das Problem ist halt, das wenn ich ein Lied abspiele und dann ein neues Lied mit dem JFileChooser ausgewählt hab, dass wenn ich dann wieder auf play drücke, der alte Thread nicht beendet wird. Also das Lied was ich zuerst gestartet hab, läuft dann immer noch und das neue Lied das ich ausgesucht habe läuft dann auch.
Also laufen beide Lieder parallel...

Aber eigentlich sollte ja der alte Thread aufhören zu laufen, da ich ja das p.close eingebaut habe:

```
void Abspielen()
  {
//    ThreadStarten();
    try{
      System.out.println(dateipfad);
      p.close();
      demoThread = new startThread();
      running = true;
      demoThread.start();
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad));
      }
      catch(Exception e){}
    }
    catch(Exception e){}
  }
```


----------



## 0x7F800000 (15. Apr 2009)

Also, ich verstehe überhaupt nicht, was dieser ganzer kram überhaupt machen soll:

```
p.close();   //player stoppen (warum nicht mit stop()?)
      demoThread = new startThread(); //überflüssiger kram
      running = true; //whatever....
      demoThread.start(); //genau dasselbe wie einfach nur p.play() direkt aufrufen?!
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad)); //das alte p spielt noch, das neue wird erstellt und... 
 //ähm... ja, keine Ahnung was passiert denn damit?
      }
```
ich verstehe auf jeden fall nicht, wieso du den eben gestoppten player sofort wieder neustartest und dann durch einen anderen ersetzst ???:L

Und nochmal: räum diesen "startThread"-krempel weg, das ist doch unmöglich zu lesen ;(


----------



## ItzChris (15. Apr 2009)

Wenn ich das aber nicht über den Thread- krempel mach, dann passiert gar nichts wenn ich auf den Play- Button drück.

Hab hier mal ne frühere Version, vielleicht könnt ihr/du damit mehr anfangen:


```
import java.io.*;
import javax.swing.*;
import javax.swing.JFileChooser;
import javax.swing.event.*;
import java.awt.*;
import java.util.ArrayList;
import java.awt.event.*;
import javazoom.jl.player.*;
import javazoom.jl.player.advanced.*;
import javazoom.jl.decoder.*;

 public class Projekt1 extends JFrame{
   JButton dir = new JButton("Durchsuchen");
   JButton play = new JButton("Play");
   JButton stop = new JButton("Stop");
   JTextArea statusbar = new JTextArea("Folgende Lieder sind ausgewählt:");
   String dateipfad;
   startThread demoThread;
   boolean running = true;
   AdvancedPlayer p;
   int i = 0;

   Projekt1(){
     super("Projekt");
     setSize(350,200);
     setDefaultCloseOperation(EXIT_ON_CLOSE);
     
     Lauscher l = new Lauscher();
     
     Container c = getContentPane();
     c.setLayout(new FlowLayout());

     dir.addActionListener(l);
     play.addActionListener(l);
     stop.addActionListener(l);

     c.add(dir);
     c.add(play);
     c.add(stop);
     c.add(statusbar);
   }
   
   class Lauscher implements ActionListener{
     public void actionPerformed(ActionEvent ae){
       String aktion = ae.getActionCommand();

       if(aktion.equals("Durchsuchen")){
         JFileChooser chooser = new JFileChooser();
         chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
         chooser.setMultiSelectionEnabled(true);
         int option = chooser.showOpenDialog(Projekt1.this);
         
         if(option == JFileChooser.APPROVE_OPTION){
           statusbar.setText(statusbar.getText()+"\n"+""+chooser.getSelectedFile().getName() +"");
           statusbar.setEditable(false);
           File[] pfad = chooser.getSelectedFiles();

           for(int i=0; i<pfad.length; i++){
             if(pfad[i].isFile()){
               try{
                 RandomAccessFile ranFile = new RandomAccessFile(pfad[i],"r");
                 byte[] bytearr = new byte[128];
                 ranFile.seek(ranFile.length()-128);
                 ranFile.read(bytearr,0,128);
                 String a = new String (bytearr,"US-ASCII");
                 if(!a.substring(0,3).equals("TAG")){
                   System.out.println("Keine Informationen vorhanden");
                   continue;
                 }
                 String title,artist,album,year,comment;
                 System.out.println("TITEL: "+a.substring(3,33).trim());
                 System.out.println("ARTIST: "+a.substring(33,63).trim());
                 System.out.println("ALBUM: "+a.substring(63,93).trim());
                 System.out.println("YEAR: "+a.substring(93,97).trim());
                 System.out.println("COMMENT: "+a.substring(97,126).trim());
                 System.out.println("GENRE: "+bytearr[127]);
               }
               catch(IOException e){
                 System.out.println(e);
               }
             }
             dateipfad = pfad[i].getAbsolutePath();
           }
           try{
             p = new AdvancedPlayer(new FileInputStream(dateipfad));
           }
           catch(Exception e){

           }
         }
         else{
           statusbar.setText("Sie haben abgebrochen");
         }
       }
       
       if(aktion.equals("Play")){
         try{
           p.close();
           demoThread = new startThread();
           running = true;
           demoThread.start();
           try{
             p = new AdvancedPlayer(new FileInputStream(dateipfad));
           }
           catch(Exception e){

           }
         }
         catch(Exception e){

         }
       }
       
       if(aktion.equals("Stop")){
         if(running){
           demoThread = null;
         }
         running = false;
         p.close();
         try{
           p = new AdvancedPlayer(new FileInputStream(dateipfad));
         }
         catch(Exception e){

         }
       }
     }
   }
   
   class startThread extends Thread{
     public void run(){
       try{
         p.play();
       }
       catch(Exception e){

       }
     }
   }
   
   public static void main(String[] args) throws FileNotFoundException, JavaLayerException{
     Projekt1 pn = new Projekt1();
     pn.setVisible(true);
     pn.setLocation(300,300);
   }
 }
```


----------



## 0x7F800000 (15. Apr 2009)

ItzChris hat gesagt.:


> Wenn ich das aber nicht über den Thread- krempel mach, dann passiert gar nichts wenn ich auf den Play- Button drück.


nun ja, wenn du die alten drei zeieln einfach gekillt hast, ohne eine irgendwo "p.play()" einzufügen, dann wär's ja kein Wunder... Aber Ferndiagnosen sind nach wie vor schwierig. 


> Hab hier mal ne frühere Version, vielleicht könnt ihr/du damit mehr anfangen:


Ist daran irgendwas anders, außer dass die ganze funktionalität in eine einzige methode gequetscht wurde, und durch elendst viele if-verzweigungen angesprochen wird?  Der "startThread"-Krempel ist da jedenfalls genauso present... :noe:


----------



## ItzChris (15. Apr 2009)

Der Play- Button:


```
if(aktion.equals("Play")){
         try{
           p.stop();
//           demoThread = new StartThread();
           running = true;
           p.play();
           try{
             p = new AdvancedPlayer(new FileInputStream(dateipfad));
           }
           catch(Exception e){

           }
         }
         catch(Exception e){

         }
       }
```

Und die class StartThread komplett raus.


----------



## 0x7F800000 (15. Apr 2009)

ItzChris hat gesagt.:


> ```
> if(aktion.equals("Play")){
> try{
> p.stop();
> ...


Es ist nichts zu hören, da ja nirgends p.play() aufgerufen wird _*mit 'nem 3-Tonnen-Betonzaunpfahl wink*_


----------



## ItzChris (15. Apr 2009)

Hatte grad flaschen Button gepostet, habs aber geändert.
Naja das abspielen geht jetzt aber da ich den StartThread rausgenommen habe, kann ich jetzt nichts mehr drücken solange wie der das Lied abspielt.


----------



## 0x7F800000 (15. Apr 2009)

ItzChris hat gesagt.:


> Hatte grad flaschen Button gepostet, habs aber geändert.
> Naja das abspielen geht jetzt aber da ich den StartThread rausgenommen habe, kann ich jetzt nichts mehr drücken solange wie der das Lied abspielt.


ja, hab da oben auch irgendwas editiert...
play() *blockiert* also? :autsch:
oh, sorry, das hätte ich nicht erwartet, dann entschuldigung... 
mach den "startThread" wieder rein, benenne ihn irgndwie sinnvoll (etwa in "PlayThread") aber rufe den jetzt erst danach auf, als das neue p erstellt wurde, nicht davor.
[top beispiel für irritierende namensgebung... "startThread" ohje... :noe:]


----------



## ItzChris (15. Apr 2009)

K, moment^^


----------



## 0x7F800000 (15. Apr 2009)

```
if(aktion.equals("Play")){
         try{
           if(running){
             p.stop();
           }
 
//           demoThread = new StartThread();
           running = true;
 
           try{
             p = new AdvancedPlayer(new FileInputStream(dateipfad));
             new Thread(){
               @Override
               public void run(){
                   p.play();
               }
              }.start();
           }
           catch(Exception e){
 
           }
         }
         catch(Exception e){
 
         }
       }
```
und so?...

Könntest du vielleicht einen Link zu diesem komischen jar posten, den du hier verwendest, und einfach deinen code grad bei rapidShare oder so hochladen? Dann könnte ich zumindest direkt sehen was da wo schiefläuft...


----------



## ItzChris (15. Apr 2009)

Also ich hatte das jetzt so gemacht:


```
if(aktion.equals("Play")){
         try{
           if(running){
             p.stop();
           }
           running = true;
           try{
             p = new AdvancedPlayer(new FileInputStream(dateipfad));
             demoThread.start();
           }
           catch(Exception e){

           }
           demoThread = new PlayThread();
         }
         catch(Exception e){

         }
       }
```

Problem ist nur das wenn ich den Thread nach dem p = new AdvancedPlayer mach, dass der Play- Button dann nicht Funzt.

JLayer 1.0 ist das wobei 1.0.1 wohl auch gehen wird^^

Java MP3 Player


----------



## 0x7F800000 (15. Apr 2009)

> Werd den Code mal bearbeiten, damit mans besser lesen kann..


jaa, passt schon, her d'mit, ich bin ja mit eclipse bewaffnet, ich werd's schon überleben (was ich für deinen code jedoch nicht garantieren kann) 
Hab mir dieses Jar 1.0.1 runtergeladen alles eingerichtet, kann mir das jetzt endlich mal ordentlich anguggn


----------



## ItzChris (15. Apr 2009)

Na dann:


```
import java.io.*;
import javax.swing.*;
import javax.swing.JFileChooser;
import javax.swing.event.*;
import java.awt.*;
import java.util.ArrayList;
import java.awt.event.*;
import javazoom.jl.player.*;
import javazoom.jl.player.advanced.*;
import javazoom.jl.decoder.*;

public class MediaPlayerGrafik extends JFrame
{
  //Erstellen der Buttons*******************************************************
  JButton  jb_titelWaehlen = new JButton("Datei wählen...");  //Anlegen des Datei wählen Buttons
  JButton  jb_weiter       = new JButton(">>|");  //Anlegen des Lied-Weiter Buttons
  JButton  jb_zurueck      = new JButton("|<<");  //Anlegen des Lied-Zurueck Buttons
  JButton  jb_pausePlay    = new JButton(">|");  //Anlegen des Play/Pause-Buttons
  JButton  jb_stop         = new JButton("|X|");  //Anlegen des Stop-Buttons

  //Anlegen benötigter Variablen und Funktionen*********************************
  StartThread demoThread;
  boolean running = true;
  String dateipfad;
  String titel;
  String interpret;
  String album;
  private AdvancedPlayer p;
  int songZaehler = -1;
  int songsZurueck = 0;
  int songsVor = 0;
  int gesamtAnzahlSongs = 0;
  String[] titelListe = new String[100];

  //Implementieren der JTable***************************************************
  JTablePlaylist jt_playlist = new JTablePlaylist();

  public MediaPlayerGrafik()
  {
    super("MediaPlayer");
    Container cp  =  getContentPane();
    setLayout(new BorderLayout());
    
    //Erstellen der Listener****************************************************
    ButtonLauscher  blauscher = new ButtonLauscher();
    JMenuLauscher  jmlauscher = new JMenuLauscher();
    
    //Erstellen der Menüleiste samt Inhalt**************************************
    JMenuBar   jmb = new JMenuBar();  //Anlegen der MenuBar
    JMenu      jm_datei = new JMenu("Datei");  //Anlegen des Menüpunktes Datei
    JMenu      jm_wiedergabeliste = new JMenu("Wiedergabeliste");  //Anlegen des Menüpunktes Wiedergabeliste
    JMenuItem  jmi_dateiOeffnen = new JMenuItem("Datei öffnen...");  //Anlegen des Untermenüs Datei öffnen
    JMenuItem  jmi_beenden = new JMenuItem("Beenden");  //Anlegen des Untermenüs Beenden
    JMenuItem  jmi_wiedergabelisteSpeichern = new JMenuItem("Wiedergabeliste speichern...");  //Anlegen des Untermenüs Wiedergabeliste speichern
    JMenuItem  jmi_wiedergabelisteLaden = new JMenuItem("Wiedergabeliste laden...");  //Anlegen des Untermenüs Wiedergabeliste laden
               jm_datei.add(jmi_dateiOeffnen);
               jm_datei.add(jmi_beenden);
               jm_wiedergabeliste.add(jmi_wiedergabelisteSpeichern);
               jm_wiedergabeliste.add(jmi_wiedergabelisteLaden);
               jmb.add(jm_datei);
               jmb.add(jm_wiedergabeliste);
               setJMenuBar(jmb);
                                  
    //Zuweisung der Lauscher****************************************************
               jb_pausePlay.addActionListener(blauscher);
               jb_stop.addActionListener(blauscher);
               jb_zurueck.addActionListener(blauscher);
               jb_weiter.addActionListener(blauscher);
               jmi_dateiOeffnen.addActionListener(jmlauscher);
               jmi_beenden.addActionListener(jmlauscher);
               jmi_wiedergabelisteSpeichern.addActionListener(jmlauscher);
               jmi_wiedergabelisteLaden.addActionListener(jmlauscher);
                    
    //Erstellen der Panels******************************************************
    JPanel  jp_panelButtons = new JPanel();
            jp_panelButtons.setLayout(new GridLayout(1,4));
            jp_panelButtons.add(jb_zurueck);
            jp_panelButtons.add(jb_pausePlay);
            jp_panelButtons.add(jb_stop);
            jp_panelButtons.add(jb_weiter);

    //Einfügen der Elemente in das ContentPane**********************************
    cp.add(jt_playlist);
    cp.add(jp_panelButtons, "South");
  }
  
  //Zuständiger ButtonLauscher für den Play-Button******************************
  public class ButtonLauscher implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      String aktion = e.getActionCommand();
      if(aktion.equals("||")){
        jb_pausePlay.setText(">|");
      }
      if(aktion.equals(">|")){
        abspielen();
      }
      if(aktion.equals("|X|"))
      {
        stop();
      }
      if(aktion.equals("|<<")){
        zurueck();
      }
      if(aktion.equals(">>|")){
        vor();
      }
    }
  }
  
  public class JMenuLauscher implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      String aktion = e.getActionCommand();

      if(aktion.equals("Beenden")){
         System.exit(0);
      }
      if(aktion.equals("Datei öffnen...")){
        titelWahl();
      }
    }
  }
  
  void abspielen()
  {
//    ThreadStarten();
    try{
      System.out.println(dateipfad);
      p.close();
      demoThread = new StartThread();
      running = true;
      demoThread.start();
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad));
      }
      catch(Exception e){}
    }
    catch(Exception e){}
  }
  
  void stop()
  {
    if(running){
      demoThread = null;
    }
    running = false;
    p.close();
  }
  
  void vor()
  {
    System.out.println("bb");
    if(songZaehler < gesamtAnzahlSongs){
      songZaehler++;
      System.out.println(songZaehler);
      songsVor++;
      dateipfad = titelListe[songZaehler];
      System.out.println(dateipfad);
      threadStarten();
    }
  }
  
  void zurueck()
  {
    if(songZaehler > 0){
      System.out.println("bb");
      songZaehler--;
      System.out.println(songZaehler);
      songsZurueck++;
      dateipfad = titelListe[songZaehler];
      threadStarten();
    }
  }
  
  void threadStarten()
  {
    try{
      System.out.println(dateipfad);
      p.close();
      demoThread = new StartThread();
      running = true;
      demoThread.start();
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad));
      }
      catch(Exception e){}
    }
    catch(Exception e){}
  }
  
  void titelWahl()
  {
    JFileChooser chooser = new JFileChooser();
                 chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    int option = chooser.showOpenDialog(MediaPlayerGrafik.this);
    if(option == JFileChooser.APPROVE_OPTION){
      File pfad = chooser.getSelectedFile();
      if(pfad.isFile()){
        try{
          RandomAccessFile ranFile = new RandomAccessFile(pfad,"r");
          byte[] bytearr = new byte[128];
          ranFile.seek(ranFile.length()-128);
          ranFile.read(bytearr,0,128);
          String tag = new String (bytearr,"US-ASCII");
          if(!tag.substring(0,3).equals("TAG")){
            System.out.println("Keine Informationen vorhanden");
            return;
          }
          titel           = tag.substring(3,33).trim();
          interpret       = tag.substring(33,63).trim();
          album           = tag.substring(63,93).trim();

          System.out.println(titel);
        }
        catch(IOException ee){
          System.out.println(ee);
        }
      }
      dateipfad = pfad.getAbsolutePath();
      try{
        p = new AdvancedPlayer(new FileInputStream(dateipfad));
      }
      catch(Exception eee){}
    }
    songZaehler++;
    System.out.println(songZaehler);
    System.out.println(titelListe[0]);
    gesamtAnzahlSongs = songZaehler;
    titelListe[songZaehler] = dateipfad;
  }
  
  class StartThread extends Thread{
     public void run(){
       try{
         p.play();
       }
       catch(Exception e){}
     }
   }
  
  //****************************************************************************
  public static void main( String[] args )
  {
    try{
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    }catch(Exception e){}
    MediaPlayerGrafik mpg                                         =               new MediaPlayerGrafik();
    mpg.setSize( 500, 300 );
    mpg.setVisible( true );
    mpg.setDefaultCloseOperation( 3 );
  }
}
```

Und das ist der andere Teil, aber funzt eh noch nicht so richtig... :


```
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.awt.event.*;


public class JTablePlaylist extends JPanel
{
   String titel;
   String interpret;
   String album;

//   public String getTitel(){
//     return titel;
//   }
//
//   public String getInterpret(){
//     return interpret;
//   }
//
//   public String getAlbum(){
//     return album;
//   }
   
   public String getTitel(){
    return titel;
  }

  public String getInterpret(){
    return interpret;
  }

  public String getAlbum(){
    return album;
  }
   JPanel jp_tabelle;
   private TableModel model;
   private JTable table;
   JTablePlaylist()
   {
//     MultimediaFunktionen MFunktionen                            =               new MultimediaFunktionen();
     String bla = titel;


     String[][] rowData = {
       {"test", "bbbb", ""+bla}
     };

     String[] columnNames = {
       "Titel", "Interpret", "Album"
     };

     model                                  =               new DefaultTableModel(rowData, columnNames);
     table                                  =               new JTable(model){
       public boolean isCellEditable(int x, int y){
         return false;
       }
     };

//     JTable table                           =               new JTable(rowData, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(450,180));
     JPanel jp_panelTabelle                 =               new JPanel();
            jp_panelTabelle.setLayout(new BorderLayout());
     JScrollPane scrollPane                 =               new JScrollPane(table);
     add(scrollPane);

     table.addMouseListener(new MouseAdapter() {
       public void mouseClicked(MouseEvent e) {
         if (e.getClickCount()==2)
         {
           int row = table.getSelectedRow();
           String sFeatureString = (String) table.getValueAt(row, 1);
           System.out.println(sFeatureString);
         }
       }
     });
   }
   
}
```


----------



## 0x7F800000 (15. Apr 2009)

Goooottverdaaammt ;(
gibt es auch fälle, wann dieses "play(start,end)" ein false rausspuckt?! :noe:


----------



## 0x7F800000 (15. Apr 2009)

@ItzChris:
Okay, ich geb auf... habe jetzt nochmal eine Stunde meines sinnlosen Lebens verwendet, um mir ein Urteil über dieses JLayer zu bilden.
Meiner meinung nach ist das völlig unbrauchbar. Dieses bescheuerte Ding schmeißt mir nur dauernd irgendwelche NullPointer- und ArrayIndexOutOfBounds- und StreamClosed- Exceptions an den Kopf, die mit keinem Wort in der äußerst dürftigen Dokumenation erwähnt sind, ich habe absolut keinen blassen schimmer Ahnung mehr, was ich mit diesem blöden Teil anstellen soll, damit der scheinbar grundlose exception regen endlich aufhört...

Jetzt habe ich sogar noch folgendes hier entdeckt:
http://www.informit.com/guides/content.aspx?g=java&seqNum=290


> If you want to add pause and resume functionality to the Player, you will need to override the play() method, but this requires that you recompile the JLayer source code because some of the objects that are referenced in the play() method are private (instead of protected.)


...aber ich habe sicherlich nicht vor, mich auch noch mit dem source code von dem Teil rumzuschlagen, nur weil die Leute die das geschrieben haben an nichts gedacht haben, und das Projekt anscheinend nach Version 1.0.1 vergessen haben. Dieses Zitat bezieht sich zwar auf 1.0, aber mit 1.0.1 habe ich ebenfalls keine pause hinbekommen, und mir fehlt langsam die Phantasie, um noch irgendwelche Hacks auszudenken. keine Ahnung.
Vielleicht krieg ich morgen irgendeinen genialen einfall.
Vielleicht meldet sich hier jemand, der sich mit diesem JLayer auskennt.
Vielleicht gefällt dir ja das ältere (aber irgendwie funktionsfähige) JMF oder das neue JMC besser...

kA, bis morgen, ich schlaf jetzt ne runde^^ :autsch:
goddamnit...


----------



## ItzChris (15. Apr 2009)

Danke das du versucht hast mir zu helfen, aber dann gehts dir ja wie mir... Hab noch gehofft gehabt das es irgenteinen Befehl halt gibt um alle Threads zu schließen die im gesamten Programm verwendet worden wurden, aber anscheinend liegt das Problem eher beim JLayer..


----------



## 0x7F800000 (15. Apr 2009)

Bist du zufrieden, wenn du dein Beispielprogramm soweit bringst, dass es laden, vom anfang abspielen und stoppen kann? Dann funktioniert's ja schon "fast", nur eben ohne pause... :autsch:


----------

