Program Mp3 player - stopowanie odtwarzania

0

Cześć to mój pierwszy post i same początki w programowaniu ;)
Mam nadzieję, że nie będziecie się wściekać na amatorskie pytanie, ale szukałem gdzie mogłem odpowiedzi by nie zawracać głowy, znalazłem kilkanaście, ale za każdym razem niestety popełniam jakiś błąd.
Mianowicie:

Napisałem w pełni działający mp3/wav player, ostatnią rzeczą do napisania został mi przycisk "STOP" Niestety podczas odtwarzania Mp3 nie mogę nacisnąć żadnego innego przycisku.

Przycisk "PLAY " jest wciśnięty i do zakończenia odtwarzania nic nie da się nacisnąć :/ Macie na to jakieś rozwiązanie?
Z góry bardzo dziękuję ;)


package Mp3Player;

import java.io.File;
import java.io.*;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.*;

public class mp3Player {

    public void graj() {

        try {

            File file = new File("C:\\Efekty dzwiekowe\\test\\branch.mp3");
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);

            try {
                Player player = new Player(bis);
                player.play();
            } catch (JavaLayerException ex) {
            }

        } catch (IOException e) {
        }

        //kod który spowalnia odtwarzanie mp3
        try {
            Thread.sleep(2000);                 //1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

    public void grajDwa() {
        //kod na włączenie kolejnej mp3
        try {

            File file = new File("C:\\Efekty dzwiekowe\\test\\approach.mp3");
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);

            try {
                Player player = new Player(bis);
                player.play();
            } catch (JavaLayerException ex) {
            }

        } catch (IOException e) {
        }

    }

    public void zmienNazwe() {

        File oldfile = new File("C:\\Efekty dzwiekowe\\test\\branch.mp3");
        File newfile = new File("C:\\Efekty dzwiekowe\\test\\branchChange.mp3");

        if (oldfile.renameTo(newfile)) {
            System.out.println("Rename succesful");
        } else {
            System.out.println("Rename failed");
        }

    }

    public void zmienNazwePonownie() {

        File oldfile = new File("C:\\Efekty dzwiekowe\\test\\branchChange.mp3");
        File newfile = new File("C:\\Efekty dzwiekowe\\test\\branch.mp3");

        if (oldfile.renameTo(newfile)) {
            System.out.println("Rename succesful");
        } else {
            System.out.println("Rename failed");

        }

    }

    public static void main(String[] args) {
        mp3Player odtwarzacz = new mp3Player();
        odtwarzacz.graj();
        odtwarzacz.grajDwa();

    }

}


1

Hej

Na początek, gratuluje pierwszego programu.
Niestety, nie widzę w tym kodzie niczego co tworzyłoby przyciski, ich obsługi ani nawet samej funkcji stop.

Kilka uwag:

  • Nazwy klas w javie piszesz zawsze z dużych liter (Pascal Case). Mp3Player
  • Nigdy nie powinieneś zostawiać pustych bloków catch. Jeżeli nie wiesz co zrobić z jakimkolwiek wyjątkiem to przynajmniej wywołaj na nim printStackTrace().
  • Jeżeli otwierasz strumień to musisz go zamknąć po użyciu. Jeżeli używasz javy > 7, poczytaj o try with resources.
  • Thread.sleep(x) jest złą praktyką. Jeżeli wątek nie musi działać przez jakiś czas, to niech się zakończy, a Ty zaplanuj za 2 sekundy uruchomienie kolejnego zadania. Jeżeli to twój główny wątek to zastosuj aktywne czekanie.
  • Formatuj kod. Jeżeli będziesz to robił, to sam znajdziesz szybciej błąd, ale również tutaj mało osób odpowiada na takie posty, bo nikomu nie chce się tego czytać. Twój IDE pewnie ma funkcję autoformatowania która skrótem klawiszowym zrobi to za Ciebie. Dodatkowo, wstawiajac kod w java na forum, wybierz "Kolorowanie składni" -> "Java". To zrobi kod jeszcze czytelniejszym i zainteresowanych tematem będzie więcej.
1

Sformatuj swój kod oraz wstaw go w znaczniki <code> (lub np <code class="java">) żeby dało się go czytać. Kod powinien wyglądać tak:

package Mp3Player;

import java.io.File;
import java.io.*;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.*;


public class mp3Player {

    public void graj() {
        try {
            File file = new File("C:\\Efekty dzwiekowe\\test\\branch.mp3");
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);

            try {
                Player player = new Player(bis);
                player.play();
            } 
            catch (JavaLayerException ex) {}
        } 
        catch (IOException e) {}

        //kod który spowalnia odtwarzanie mp3

        try {
            Thread.sleep(2000); //1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }


    public void grajDwa() {
        try {
            File file = new File("C:\\Efekty dzwiekowe\\test\\approach.mp3");
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);

            try {
                Player player = new Player(bis);
                player.play();
            } 
            catch (JavaLayerException ex) {}
        } 
        catch (IOException e) {}
    }

    public void zmienNazwe() {
        File oldfile = new File("C:\\Efekty dzwiekowe\\test\\branch.mp3");
        File newfile = new File("C:\\Efekty dzwiekowe\\test\\branchChange.mp3");

        if (oldfile.renameTo(newfile)) {
            System.out.println("Rename succesful");
        } else {
            System.out.println("Rename failed");
        }
    }

    public void zmienNazwePonownie() {
        File oldfile = new File("C:\\Efekty dzwiekowe\\test\\branchChange.mp3");
        File newfile = new File("C:\\Efekty dzwiekowe\\test\\branch.mp3");

        if (oldfile.renameTo(newfile)) {
            System.out.println("Rename succesful");
        } else {
            System.out.println("Rename failed");
        }
    }

    public static void main(String[] args) {
        mp3Player odtwarzacz = new mp3Player();
        odtwarzacz.graj();
        odtwarzacz.grajDwa();
    }

}
0

Chłopaki wielkie dzięki, oczywiście następnym razem już poprawnie wszystko i poprawnie sformatuje kod :) Krzysiek050 od jutra dokładnie przeanalizuje każdy punkt o którym napisałeś bo w tej chwili mało mi to mówi:) więc poczytam o tym w necie. Bardzo Wam dziękuję, że chciało Wam się odpisać ;)

0

Krzysiek050 masz racje :) całą wizualną formę umieściłem w innej klasie do której nie wysłałem kodu :/ .
Nie stworzyłem jeszcze tej metody przycisku stop, jednak z tym czuję, że jakoś sobie prędzej czy później poradzę.

Najgorsze jest, że w czasie gdy gra muzyka, nie działają inne przyciski. To mnie całkiem blokuje.... Nie mam pojęcia jak to opisać....
Hmmm głupio prosić o pomoc w pisaniu kodu, ale mógłbyś mi tylko powiedzieć jak to nazwać bym mógł tego poszukać w google ?
Będę bardzo wdzięczny i jak tylko się nauczę chętnie zrekompensuję się wiedzą ;)

package wordsy;

import Mp3Player.mp3Player;
import java.awt.Color;
import static java.lang.System.exit;
import static javafx.scene.input.KeyCode.R;
import javax.swing.text.View;

public class JFrameInne extends javax.swing.JFrame {

    public JFrameInne() {

        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jPanel1 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        jLabel3 = new javax.swing.JLabel();
        jSeparator2 = new javax.swing.JSeparator();
        jToggleButton1 = new javax.swing.JToggleButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("WORDSY");
        setBounds(new java.awt.Rectangle(0, 0, 600, 400));
        setResizable(false);
        setSize(new java.awt.Dimension(488, 300));

        jButton1.setLabel("Wróć");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Kategoria:  Inne");

        jButton2.setText("Odtwarzaj ");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton5.setText("Stop");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        jPanel1.setBackground(new java.awt.Color(204, 204, 204));

        jLabel2.setForeground(new java.awt.Color(51, 51, 51));
        jLabel2.setText("Approach");

        jLabel3.setForeground(new java.awt.Color(51, 51, 51));
        jLabel3.setText("Branch");

        jToggleButton1.setBackground(new java.awt.Color(0, 119, 0));
        jToggleButton1.setText("ON");
        jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSeparator1)
                    .addComponent(jSeparator2)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 200, Short.MAX_VALUE)
                        .addComponent(jToggleButton1)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(16, 16, 16)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jToggleButton1))
                .addGap(7, 7, 7)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(140, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(jPanel1);

        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(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 326, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE)
                            .addComponent(jButton5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton1))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(45, Short.MAX_VALUE))
        );

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JframeGlowna open = new JframeGlowna();
        open.setVisible(true);
        this.dispose();
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        mp3Player pobierz = new mp3Player();
        pobierz.graj();
        pobierz.grajDwa();

    }                                        

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         


    }                                        

    private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               
        if (jToggleButton1.isSelected()) {
            jToggleButton1.setBackground(Color.red);
            jToggleButton1.setText("OFF");
            mp3Player zmien = new mp3Player();
            zmien.zmienNazwe();
        } else {
            jToggleButton1.setBackground(Color.green);
            jToggleButton1.setText("ON");
            mp3Player zmien = new mp3Player();
            zmien.zmienNazwePonownie();

        }
    }                                              

    public static void main(String args[]) {

        //<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 ex) {
            java.util.logging.Logger.getLogger(JFrameInne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JFrameInne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JFrameInne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JFrameInne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JFrameInne().setVisible(true);

                {
                }

            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JToggleButton jToggleButton1;
    // End of variables declaration                   
}

1

Kod który gra muzykę u Ciebie wywołuje się w wątku odpowiedzialnym za obsługę zdarzeń.

Może to Ci ułatwi:

  1. To że możesz jednoczesnie słuchać muzyki i ustawiać playlistę w np Windows Media Player jest efektem tego że te dwie akcje są wywołane w różnych wątkach (działają obok siebie, równocześnie a nie jedno po drugim).

  2. Jeżeli piszesz funkcję która wygląda np tak:

System.out.println('Siema');
System.out.println('Druga siema');

to jak się spodziewasz, te dwie linijki wykonają się jedna po drugiej, a nie równocześnie (są w jednym wątku). Druga nie zacznie się wykonywać dopóki druga się nie skończy (choćby trwało to bardzo długo).

  1. Jeżeli więc klikasz przycisk, to watek który ogarnia zdarzenia wykonuje tą metodę player.play();. I nic co jest później nie zacznie się wykonywać dopóki play nie skończy swojego działania.

Rozwiązania:

  1. Skorzytaj z api które jest asynchroniczne.
  2. Wywołaj player.play() w innym wątku.
0

Cześć Tom Riddle bardzo dziękuję za odpowiedz. Tom a wiesz może jak powinna brzmieć metoda ,która zatrzymuje wykonywanie metody play()? Mój utwór ma 5 minut i nie mam pojęcia jak napisać kod przycisku który zatrzyma odtwarzanie tego utworu ;/ Wiesz może jak powinna nazywać się taka metoda bym mógł o niej gdzieś poczytać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1