Java 如何在单击不同按钮时播放多个WAV文件?

Java 如何在单击不同按钮时播放多个WAV文件?,java,swing,jbutton,javasound,Java,Swing,Jbutton,Javasound,我正在用Java创建一个简单的音调拨号器。我已经完成了在文本字段中显示按钮和它们的功能。我只是不知道如何让我的按钮在点击时发出声音。我还需要他们在按下“拨号”键后播放所有号码的铃声(比如打电话给某人时)。我有大约12个WAV文件的音调,这是我的代码帧到目前为止(不是驱动程序类) 这有点棘手,我知道你在多线程方面有多丰富的经验 首先,我会尝试使用MVC模式。您已经完成了视图部分的基本设置。对于该模型,可能一个enum类对电话号码的每个号码都有意义,其中每个enum都与一个ID、一个用于显示的字符串

我正在用Java创建一个简单的音调拨号器。我已经完成了在文本字段中显示按钮和它们的功能。我只是不知道如何让我的按钮在点击时发出声音。我还需要他们在按下“拨号”键后播放所有号码的铃声(比如打电话给某人时)。我有大约12个WAV文件的音调,这是我的代码帧到目前为止(不是驱动程序类)


这有点棘手,我知道你在多线程方面有多丰富的经验

首先,我会尝试使用MVC模式。您已经完成了视图部分的基本设置。对于该模型,可能一个
enum
类对电话号码的每个号码都有意义,其中每个
enum
都与一个ID、一个用于显示的
字符串和一个相关的
剪辑
(预加载)或.wav文件地址(如果使用
SourceDataLine
)以及一个播放方法相关联

然后,一个关键的
控制功能是连续播放电话号码,可能是在它自己的线程中,这样你就不会死在水里等待声音播放完毕

我会把这个控制器变成一个类,让它实现一个
LineListener
,并让它响应
Line.EventType.STOP
(可能只是为松散耦合的方法设置一个状态标志/布尔值),作为一种管理单个
片段
源数据线
播放顺序和计时的方法。(@camickr在评论中提到了这一点)

我还将启动在自己的线程中执行电话号码播放的部分。它可以是控制器类中的私有类,因此引用父类对
LineListener
的实现,以检查何时继续“下一个”声音


这是基本的平面图。还有一些细节需要解决,但希望这能帮助您解决问题。

1)类名应该以大写字符开头。2) 你为什么发布这些代码?你的问题是关于播放声音。要了解播放声音的概念,请从一个简单的示例开始,而不是从整个应用程序开始。所以你只需要一个带一个按钮的框架。请参阅:了解一个简单的示例。我还需要他们播放所有的数字,所以你需要知道当一个声音结束时,你可以播放另一个。我相信您可以在
剪辑中添加
LineListener
,当声音停止时将生成一个事件。1)为了更快获得更好的帮助,请添加或。要缩短代码,请从实现两个键的功能开始。一旦这样做起作用,就应该清楚如何添加其余的键。2) 请对代码和代码片段、结构化文档(如HTML/XML或输入/输出)使用代码格式。为此,请选择文本并单击邮件发布/编辑表单顶部的
{}
按钮。3) 使用缩进代码行和代码块的逻辑和一致形式。缩进。。。。旨在使代码流更易于遵循!大多数IDE都有专门用于格式化代码的键盘快捷键。4) 在源代码中只需要一行空白就可以了。
{
之后或
}
之前的空行通常也是多余的。5) 请学习常见的Java命名法(命名约定-例如
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是
大写常量
),并一致使用它。例如:(我注意到的)
dialerFrame
应该是
dialerFrame
。。。。6) 但是,尽管如此,不要扩展
JFrame
只使用一个实例,就像代码使用
JButton
JTextField
的普通实例一样。7) 对于手头的任务,使用from播放WAV。或者,稍微复杂一点,在运行时在内存中生成音调。好的,但我如何导入wav文件以供任何按钮播放?还有一种方法可以得到一个按钮的标签吗?我不是说名称,因为我为12个按钮指定了一个名称,因为它们做相同的事情,但我需要它们播放不同的声音,所以有没有一种方法可以让我得到按钮上打印的标签,而不是名称。
public class dialerFrame extends JFrame
{
    private JTextField display;// creating text field display
    private static final int FRAME_WIDTH = 500;// frame width
    private static final int FRAME_HEIGHT = 500;// frame height
    private JButton numButton, clrButton, backButton, dialButton;//creating all buttons needed

    /**
     * Constructor to build frame
     */
    public dialerFrame()
    {
        display = new JTextField ("");//setting text field to empty 
        display.setEditable(false);//setting text field to not take in values
        add(display, BorderLayout.NORTH);//assigning north region for the text field and adding to frame
        createNumButtonPanel();
        createOperatorButtonPanel();
        setSize(FRAME_WIDTH, FRAME_HEIGHT);//
    }

    /**
     * Method to construct all numeric buttons from 1-9 and set layout
     */
    private void createNumButtonPanel()
    {
        JPanel numButtonPanel = new JPanel();// creating a panel for numbers and symbols only
        numButtonPanel.setLayout(new GridLayout(4,3));//setting 4 by 3 grid layout for the panel

        //adding the buttons on the panel
        numButtonPanel.add(makeDigitButton("1"));
        numButtonPanel.add(makeDigitButton("2"));
        numButtonPanel.add(makeDigitButton("3"));
        numButtonPanel.add(makeDigitButton("4"));
        numButtonPanel.add(makeDigitButton("5"));
        numButtonPanel.add(makeDigitButton("6"));
        numButtonPanel.add(makeDigitButton("7"));
        numButtonPanel.add(makeDigitButton("8"));
        numButtonPanel.add(makeDigitButton("9"));
        numButtonPanel.add(makeDigitButton("*"));
        numButtonPanel.add(makeDigitButton("0"));
        numButtonPanel.add(makeDigitButton("#"));

        add(numButtonPanel, BorderLayout.CENTER);//adding panel to frame in the center
    }

    /**
     * Method to construct operator buttons and assign their function separately 
     */
    private void createOperatorButtonPanel()
    {
        JPanel operatorButtonPanel = new JPanel(new GridLayout(1,3));//creating panel for the operator buttons
        OperatorButtonListener listener = new OperatorButtonListener();// listener for operator buttons
        //creating operator buttons and assigning action listener 
        clrButton = new JButton("CLR");
        clrButton.addActionListener(listener);
        backButton = new JButton("BACK");
        backButton.addActionListener(listener);
        dialButton = new JButton("DIAL");
        dialButton.addActionListener(listener);

        //adding operator buttons to panel
        operatorButtonPanel.add(clrButton);
        operatorButtonPanel.add(backButton);
        operatorButtonPanel.add(dialButton);

        //adding panel to frame in the south region
        add(operatorButtonPanel, BorderLayout.SOUTH);
    }

    /**
     * Inner class listener for the numeric buttons
     */
    private class DigitButtonListener implements ActionListener
    {
        private String digit;

         public DigitButtonListener(String digit)
         {
             this.digit = digit;
         }

         /**
          * Overriding actionPerformed method to be used by the numeric buttons
          */
         public void actionPerformed(ActionEvent event) 
         {
             display.setText(display.getText() + digit);//displaying the corresponding digit on the text field
         }
    }

    /**
     *Inner class listener for operator buttons
     */
    private class OperatorButtonListener implements ActionListener
    {
        /**
        * Overriding actionPerformed method to be used for by the operator Button
        */
        public void actionPerformed (ActionEvent event)
        {
            if(event.getSource() == backButton)
            {
                display.setText(""+display.getText().substring(0, display.getText ().length() - 1));// remove last character
            }
            if(event.getSource() == clrButton)
            {
                display.setText("");// clear text field
            }
            if(event.getSource() == dialButton)
            {

            }
        }
    }

    /**
     * Makes a button representing a digit of the dialer.
     * @param digit takes in digit for dialer 
     * @return numButton the respective button of the dialer
     */
    public JButton makeDigitButton(String digit)
    {
        numButton = new JButton(digit);
        ActionListener listener = new DigitButtonListener(digit);
        numButton.addActionListener (listener);
        return numButton;
    }
}