PROBLEMA [JAVA GUI] Lettore mp3 che non smette di suonare

Sergei

Utente Attivo
115
1
Salve, gente :)

Dopo aver evitato il volo dalla finestra grazie ai vostri consigli, ho ripreso ad impazzire vicino a Java.
Stavo provando un po' il fantastico mondo GUI e m'è venuto in mente di creare un semplice lettore mp3 con 4 pulsanti:
- Apri
- Play
- Pausa
- Stop

Volevo anche aggiungere una casella di testo che leggesse il titolo della canzone ma per ora evito e vediamo il perché :asd:

Innanzitutto (logica a parte) ho cercato di capire se ci fosse qualche Classe che mi permettesse di far suonare Java (:sisi:). Mi sono messo alla ricerca su internet e ho letto di java zoom e della libreria mp3 JLayer.
Ottimo. Importo tutto ed inizio a vedere un po' cosa fare.
Creo la finestra con i pulsanti. Il primo problema è il tasto sfoglia/apri. Mi metto di nuovo alla ricerca e vedo che esiste JFileChooser che fa al caso mio. Inizio a bestemmiare perché non capisco come associarlo al pulsante apri. Dopo 2 ore finisco (ma va? :oogle:) sul sito della oracle e leggo direttamente dalla guida come fare. Inserisco anche il filtro per i soli file mp3. Faccio partire il mio mini lettore. Apro, funziona! Miracolo. Ok, ora apro un file mp3 e funge! Ottimo, ottimo.
Il problema è che si è impallato il lettore! Non posso stoppare o premere alcun pulsante. Nemmeno se clicco sulla X per chiudere la finestra funge. Soluzione (sono sotto windows): task manager.
Ora, essendo io newbie fino in fondo, mi chiedevo... dov'è il problema?
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Se premi i pulsanti e non succede niente evidentemente è perchè ai tasti non è collegato alcun evento. Stesso vale per la X della finestra: se non colleghi l'evento che chiude il programma non si chiuderà mai! Se posti il codice comunque ti possiamo essere ancora più utili :sisi:
 

Sergei

Utente Attivo
115
1
E' quello che avevo pensato anche io, solo che il tasto apri e il tasto stop (almeno credo lo stop xD) hanno funzione. Stessa cosa per la x. Ma forse ho sbagliato :D
Comunque ecco il codice:
Codice:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

import javazoom.jl.player.advanced.AdvancedPlayer;

public class Finestra extends JFrame implements ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JButton apri;
    JButton play;
    JButton pausa;
    JButton stop;
    JPanel pannello;
    final JFileChooser open = new JFileChooser();
    AdvancedPlayer player;
    File file;

    public Finestra() {
        super("JMp3");
        setSize(400, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // creo il primo pannello
        JPanel pannello = new JPanel();

        // creo 4 pulsanti
        apri = new JButton("Apri");
        play = new JButton("Play");
        pausa = new JButton("Pausa");
        stop = new JButton("Stop");

        // inserisco il filtro al JFileChooser
        open.setFileFilter(new FileNameExtensionFilter("Archivio mp3", "mp3"));

        // aggiungo i pulsanti al pannello
        pannello.add(apri);
        pannello.add(play);
        pannello.add(pausa);
        pannello.add(stop);
        // pannello.add(test);

        // faccio usare il pannello a JFrame
        add(pannello, BorderLayout.SOUTH);

        // attivo il pulsante apri
        apri.addActionListener(this);
        stop.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        // int a = open.showOpenDialog(null);

        if (e.getSource() == apri) {
            int a = open.showOpenDialog(Finestra.this);
            if (a == JFileChooser.APPROVE_OPTION) {
                file = open.getSelectedFile();
                try {
                    player = new AdvancedPlayer(new FileInputStream(file));
                    player.play();
                } catch (Exception ecc) {
                    System.out.println(ecc);

                }
            }

        }
        if (e.getSource() == stop) {
            try {
                player.stop();
            } catch (Exception ecc1) {
                System.out.println(ecc1);
            }

        }
    }

}

che poi a pensarci player.stop() come fa a funzionare se non è stato istanziato? Cioè viene istanziato nel ciclo if sopra ma non dovrebbe essere legato solo a quel ciclo?
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
guarda, apri e stop li hai collegati ad un evento, play e stop no:
Codice:
apri.addActionListener(this);
stop.addActionListener(this);
// play e stop??
 

Sergei

Utente Attivo
115
1
sì, sì, hai ragione. non li ho collegati di proposito perché volevo testare se funzionava apri e stop. Devono per forza essere tutti collegati per verificare il funzionamento degli altri due? Cioè, apri funziona e stop che non va. Il problema è che tutto la finestra rimane bloccata con la musica in esecuzione
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
No se qualcuno non lo colleghi non funzionerà, ma non comprometterà il funzionamento degli altri se è questo che intendi. Posta il codice in cui colleghi tutto e vediamo!
 

Sergei

Utente Attivo
115
1
sì, esattamente è quello che intendevo.

Ecco il codice. Ho fatto tutto di fretta che sto uscendo quindi sicuramente ho sbagliato qualcosa. Non mi è chiaro il fatto di azionare e stoppare con player.stop() etc... perché: 1) non ho ancora letto bene come funziona :D 2) perché se non istanzio l'oggetto player può lo stesso prendere il metodo stop? boh. Ignoranza profonda :(

Codice:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

import javazoom.jl.player.advanced.AdvancedPlayer;

public class Finestra extends JFrame implements ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JButton apri;
    JButton play;
    JButton pausa;
    JButton stop;
    JPanel pannello;
    final JFileChooser open = new JFileChooser();
    AdvancedPlayer player;
    File file;

    public Finestra() {
        super("JMp3");
        setSize(400, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // creo il primo pannello
        JPanel pannello = new JPanel();

        // creo 4 pulsanti
        apri = new JButton("Apri");
        play = new JButton("Play");
        pausa = new JButton("Pausa");
        stop = new JButton("Stop");

        // inserisco il filtro al JFileChooser
        open.setFileFilter(new FileNameExtensionFilter("Archivio mp3", "mp3"));

        // aggiungo i pulsanti al pannello
        pannello.add(apri);
        pannello.add(play);
        pannello.add(pausa);
        pannello.add(stop);
        // pannello.add(test);

        // faccio usare il pannello a JFrame
        add(pannello, BorderLayout.SOUTH);

        // attivo il pulsante apri
        apri.addActionListener(this);
        play.addActionListener(this);
        pausa.addActionListener(this);
        stop.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        // int a = open.showOpenDialog(null);

        if (e.getSource() == apri) {
            int a = open.showOpenDialog(Finestra.this);
            if (a == JFileChooser.APPROVE_OPTION) {
                file = open.getSelectedFile();
                try {
                    player = new AdvancedPlayer(new FileInputStream(file));
                    player.play();
                } catch (Exception ecc) {
                    System.out.println(ecc);

                }
            }

        }

        if (e.getSource() == play) {
            try {
                player.play();
            } catch (Exception ecc1) {
                System.out.println(ecc1);
            }

        }

        if (e.getSource() == pausa) {
            try {
                player.wait();
            } catch (Exception ecc1) {
                System.out.println(ecc1);
            }

        }

        if (e.getSource() == stop) {
            try {
                player.stop();
            } catch (Exception ecc1) {
                System.out.println(ecc1);
            }

        }
    }

}
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Io non conosco la classe quindi non so risponderti..provalo e facci sapere che succede, comunque non ho visto errori :)
 

Sergei

Utente Attivo
115
1
comunque non ho visto errori :)

il che sa di miracoloso visto che è il mio primo tentativo di fare una cosa del genere :D

Comunque domani provo a controllare meglio... devi esserci l'errore da qualche parte, perché non è possibile che parti l'mp3 e non si possa stoppare o chiudere la finestra O__O
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Ho appena provato il codice e il tasto stop funziona. E la finestra si chiude :sisi:
Solo che non ho visto i tasti play e stop.. dove sono?
 

Sergei

Utente Attivo
115
1
Ho appena provato il codice e il tasto stop funziona. E la finestra si chiude :sisi:
Solo che non ho visto i tasti play e stop.. dove sono?

aspè, mi sa che ti sei sbagliato :D se hai provato il tasto stop e dopo non lo trovi hai sbagliato a scrivere :)
a parte gli scherzi, ma hai chiuso la finestra con l'mp3 che è partito?
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Ho fatto play e il suono dura neanche 2 secondi. Se però in quei due secondi premo stop allora si stoppa. Non ho provato a chiudere durante quei 2 secondi..
 

Sergei

Utente Attivo
115
1
maledizione... uhm... provo su ubuntu con eclipse, vediamo se funge come a te, non vorrei che si fosse impazzito eclipse su windows con tutti i plugin che ho installato (ma poi per quale motivo li ho installati? :D)
Grazie mille! Dopo ti faccio sapere
 

Sergei

Utente Attivo
115
1
ho provato su ubuntu ma stessa cosa.
Lancio l'applicazione. Clicco su apri, seleziono l'mp3, parte la musica e l'applicazione è tutta bloccata. Non posso cliccare su niente né si chiude :(
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Su eclipse mi funziona tutto e non si blocca niente. Su netbeans ho dovuto scaricare il file JLayer 1.0.1 perchè mi dava errore all'import della libreria javazoom e inoltre mi dava l'errore sul fatto che manca il main! Anche se lo aggiungo io il programma parte ma non si inizializza neanche la GUI che si blocca..

---------- Post added at 19:41 ---------- Previous post was at 19:18 ----------

Ecco. Ho trovato questo codice googlando un pò e l'ho adattato con una canzone a caso e funziona ovunque. A questo punto dovresti adattargli facilmente una GUI così da poter aggiungerci i tasti pausa e stop ecc ecc..
Codice:
package com.informit.jlayer;


// Import the JLayer classes
import javazoom.jl.player.*;


// Import the Java classes
import java.io.*;


/**
 *
 * @author shaines
 */
public class mp3 {


 private Player player;
 private InputStream is;


 /** Creates a new instance of MP3Player */
 public mp3( String filename )
 {
  try
  {
   // Create an InputStream to the file
   is = new FileInputStream( filename );
  }
  catch( Exception e )
  {
   e.printStackTrace();
  }
 }


 public void play()
 {
  try
  {
   player = new Player( is );
   PlayerThread pt = new PlayerThread();
   pt.start();
   while( !player.isComplete() )
   {
    int position = player.getPosition();
    System.out.println( "Position: " + position );
    try
    {
     Thread.sleep( 1000 );
    }
    catch( Exception ee )
    {
     ee.printStackTrace();
    }
   }
  }
  catch( Exception e )
  {
   e.printStackTrace();
  }
 }


 class PlayerThread extends Thread
 {
  public void run()
  {
   try
   {
    player.play();
   }
   catch( Exception e )
   {
    e.printStackTrace();
   }
  }
 }




 public static void main( String[] args )
 {
  
  mp3 mp3Player = new mp3("C:\\Users\\CARLO\\Music\\Fabrizio De Andre' Discografia Completa e Testi\\1970 - La buona novella\\09 - Il testamento di Tito.mp3");
  mp3Player.play();
 }
}
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!