Использование многопоточности: почему из поля со списком, когда я выбрал первую песню, она работает нормально, но вторая и третья не работают? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть три подвижных партитуры и соответствующие три музыкальные композиции для одновременного воспроизведения, когда партитура движется. Основные функции перечислены ниже:

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

public class Test21 {
    public static void main(String[] args) {
        JFrame  jf = new JFrame("康樂彩歌(v0)");
        jf.setBounds(0, 0, 1368, 730);      
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(null);

        JComboBox cmbox = new JComboBox();
        cmbox.setBounds(10, 40, 250, 40);
        cmbox.setLocation(370,25);
        cmbox.setFont(new Font("新細明體", Font.PLAIN, 30));
        cmbox.addItem("紫竹調");
        cmbox.addItem("走一同去郊遊");
        cmbox.addItem("我家門前有小河");

        jf.add(cmbox);

        JRadioButton rb2 = new JRadioButton("加人聲", false);
        rb2.setFont(new Font("新細明體", Font.PLAIN, 20));
        rb2.setBounds(635, 28, 90, 30);
        jf.add(rb2);

        JButton btPlay = new JButton("PLAY");
        btPlay.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btPlay.setBounds(740, 25, 100, 40);
        jf.add(btPlay);
        jf.setVisible(true);

        Panel1 jp1 = new Panel1();
        Panel2 jp2 = new Panel2();
        Panel3 jp3 = new Panel3();
        AudioTest1 runAudio = new AudioTest1(); //AudioTest1.java is listed below this section

        btPlay.addActionListener(new ActionListener() {//加上事件接收器-對按鍵"PLAY"
           @Override
           public void actionPerformed(ActionEvent e) {//接收到事件後進行以下的處理
               Thread a = new Thread()
                  {
                    public void run()
                    {
                        if (cmbox.getSelectedIndex() == 0)
                            {
                              jp1.setBounds(0, 70, 1368, 630);
                              jf.add(jp1);
                              jp1.move = false;
                              jp1.display();
                              runAudio.audioFileName = "audio1.wav"; //This is the first music
                                                                       file to be played
                              runAudio.AudioPlay();
                            }
                        else if (cmbox.getSelectedIndex() == 1)
                            {
                              jp2.setBounds(0, 70, 1368, 630);
                              jf.add(jp2);
                              jp2.move = false;
                              jp2.display();
                              runAudio.audioFileName = "audio2.wav";//This is the second music 
                                                                      file to be played                               
                              runAudio.AudioPlay();
                            } 
                        else if (cmbox.getSelectedIndex() == 2)
                            { 
                              jp3.setBounds(0, 70, 1368, 630);
                              jf.add(jp3);
                              jp3.move = false;
                              jp3.display();
                              runAudio.audioFileName = "audio3.wav";//This is the third music 
                                                                      file to be played
                              runAudio.AudioPlay();
                            }

                        jf.setVisible(true);
                    }
                  };
                Thread b = new Thread()
                  {
                    public void run()
                    {
                        if (cmbox.getSelectedIndex() == 0)
                            {
                              jp1.move = true;
                              jp1.display();
                            }
                        else if (cmbox.getSelectedIndex() == 1)
                            {
                              jp2.move = true;
                              jp2.display();
                            } 
                        else if (cmbox.getSelectedIndex() == 2)
                            {
                              jp3.move = true;
                              jp3.display();
                            }   
                    }
                  };
                a.start();
                b.start();

              }
           });
    }
}

AudioTest1. java перечислены ниже:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

class AudioTest1 {//to play the music
    String audioFileName; 
    public void AudioPlay() {

        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

        try{
          Clip clip = AudioSystem.getClip();
          AudioInputStream inputStream = AudioSystem.getAudioInputStream(classLoader.getResourceAsStream(audioFileName));

              clip.open(inputStream);
              clip.start();
              while (!clip.isRunning())
                  Thread.sleep(0);
              while (clip.isRunning())
                  Thread.sleep(0);
              clip.close();
            } catch (Exception e)
                {
                  e.printStackTrace(); 
                  System.out.println(e); 
                }
    } 
}

Я не понимаю, почему структура для запуска каждого из трех файлов musi c выглядит одинаково, но почему результаты разные?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...