2

再生またはループ ボタンをクリックするとオーディオ ファイルを再生し、停止をクリックすると停止する単純なアプレットを作成しようとしています。しかし、何らかの理由でイベント処理が正しく機能せず、その理由がわかりません。

これが私のコードです:

import java.applet.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;


public class JWater extends JApplet {

public void init()
{
    sound = getAudioClip(getCodeBase(),"water001.au"); //Set audio file

    //Prepare to try and create GUI
    try
    {
        SwingUtilities.invokeAndWait(new Runnable()
        {
            public void run()
            {                   
                makeGUI(); //Create the GUI                         
            }
        });
    }

    catch (Exception e)
    {
        System.err.println("GUI was not created successfully"); //In case something goes wrong
    }               
}

private void makeGUI() {

    //Create content pane which everything will reside in
    setBounds(100, 100, 317, 189);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    setVisible(true);

    //Create and add panel, buttons and the label will be added to this 
    JPanel panel = new JPanel();
    panel.setBounds(0, 0, 300, 150);
    contentPane.add(panel);
    panel.setLayout(null);

    //Create and add the label
    JLabel lblNewLabel = new JLabel("This is the sound of flowing water.");
    lblNewLabel.setBounds(54, 46, 250, 14);
    panel.add(lblNewLabel);

    jOP = new JOptionPane();
    jOP.setBounds(10,40,250,10);
    panel.add(jOP);


    //Create and add media control buttons      
    JButton btnPlay = new JButton("Play");
    btnPlay.setBounds(10, 116, 89, 23);
    panel.add(btnPlay);

    JButton btnLoop = new JButton("Loop");
    btnLoop.setBounds(109, 116, 89, 23);
    panel.add(btnLoop);

    JButton btnStop = new JButton("Stop");
    btnStop.setBounds(208, 116, 89, 23);
    panel.add(btnStop);

    //Create an event handler named handler
    EventHandler handler = new EventHandler();

    //Add these action listeners to detect when a button is clicked
    btnPlay.addActionListener(handler);
    btnLoop.addActionListener(handler);
    btnStop.addActionListener(handler);
}

//Implement the event handler class for button clicks
    class EventHandler implements ActionListener
    {       
        public void actionPerformed(ActionEvent event)
        {
            if (event.getSource() == btnPlay)   
            {

            }

            else if (event.getSource() == btnLoop)  
            {

            }

            else if (event.getSource() == btnStop)  
            {                           
            }

            else
            {           
                JOptionPane.showMessageDialog(null,"Message not detected or not sent!!!  Recevied " + event.getSource(),"ERROR CODE 1",JOptionPane.ERROR_MESSAGE);
            }
        }       
    }

    AudioClip sound;
    JPanel contentPane,panel;
    JButton btnPlay,btnLoop,btnStop;
    JOptionPane jOP;
}

ボタンがクリックされるたびに、if ステートメントを通過し、デバッガーの else に到達します。EventHandler クラス内に何か問題があるのではないかと思いますが、どこにあるのかわかりません。私は他のプログラムでこの方法を使用しましたが、うまく機能しますが、この方法では機能しません。

4

1 に答える 1

4
//Create and add media control buttons      
JButton btnPlay = new JButton("Play");
btnPlay.setBounds(10, 116, 89, 23);
panel.add(btnPlay);

JButton btnLoop = new JButton("Loop");
btnLoop.setBounds(109, 116, 89, 23);
panel.add(btnLoop);

JButton btnStop = new JButton("Stop");
btnStop.setBounds(208, 116, 89, 23);
panel.add(btnStop);

次のようにする必要があります。

//Create and add media control buttons      
btnPlay = new JButton("Play");
btnPlay.setBounds(10, 116, 89, 23);
panel.add(btnPlay);

btnLoop = new JButton("Loop");
btnLoop.setBounds(109, 116, 89, 23);
panel.add(btnLoop);

btnStop = new JButton("Stop");
btnStop.setBounds(208, 116, 89, 23);
panel.add(btnStop);

あなたが見る当面の問題を解決するために。ボタンを作成する前に追加することJButtonで、コードはそれらをローカル変数として効果的に再宣言しています。これにより、アクション リスナーが比較するクラス属性を「シャドウイング」します。

さらなるヒント

  1. setBounds(100, 100, 317, 189); それを削除します。アプレットのサイズは HTML で設定する必要があります。
  2. Java GUI は、さまざまな画面解像度やさまざまな PLAF を使用するさまざまなプラットフォームで動作する必要がある場合があります。そのため、コンポーネントを正確に配置するのに役立ちません。堅牢な GUI のコンポーネントを整理するには、代わりにレイアウト マネージャー、またはそれらの組み合わせを使用し、空白のレイアウト パディングと境界線を使用します。

    Java GUI は、さまざまな画面解像度やさまざまな PLAF を使用するさまざまなプラットフォームで動作する必要がある場合があります。そのため、コンポーネントを正確に配置するのに役立ちません。堅牢な GUI のコンポーネントを整理するには、代わりにレイアウト マネージャー、またはそれらの組み合わせ1を、余白のレイアウト パディングと境界線と共に使用します2
    1. ネストされたレイアウト
    2. ホワイトスペース

于 2013-07-29T01:41:52.070 に答える