2

「スタート」「一時停止」「ストップ」の3つのボタンがあるストップウォッチを作ってみました。私のインストラクターは、アクション リスナーを 2 つのボタンに設定する方法だけを教えてくれました。アクション リスナーを 3 つのボタンに設定するにはどうすればよいですか? これまでの私のコーディングは次のとおりです

JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");

startButton.addActionListener(this);
stopButton.addActionListener(this);

public void actionPerformed(ActionEvent actionEvent) {
    Calendar aCalendar = Calendar.getInstance();
    if (actionEvent.getActionCommand().equals("Start")){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );

    }
}

とにかくタイマーを一時停止する方法がわからないため、「一時停止」機能用のアクション リスナーをまだ作成していません。しかし、一時停止する方法を理解する前に、アクションをボタンにリンクしたかったのです。

4

3 に答える 3

3

あなたが探しているのはif-then-else if-then声明です。

ActionListener基本的に、これまで行ってきたように、3 つのボタンすべてに を追加します...

JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");

startButton.addActionListener(this);
stopButton.addActionListener(this);
pauseButton.addActionListener(this);

次に、if-else-if一連の条件を指定して、発生する可能性のあるそれぞれをテストします (予想どおりです)。

public void actionPerformed(ActionEvent e) {
    Calendar aCalendar = Calendar.getInstance();
    if (e.getSource() == startButton){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else if (e.getSource() == stopButton) {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );
    } else if (e.getSource() == pauseButton) {
        // Do pause stuff
    }
}

詳細については、if-then および if-then-else ステートメントを詳しく見てください。

ボタンへの参照を使用しようとする代わりactionCommandに、代わりに のプロパティを使用することを検討してAcionEventください。これは、元のボタンを参照できるようにする必要がないことを意味します...

public void actionPerformed(ActionEvent e) {
    Calendar aCalendar = Calendar.getInstance();
    if ("Start".equals(e.getActionCommand())){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else if ("Stop".equals(e.getActionCommand())) {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );
    } else if ("Pause".equals(e.getActionCommand())) {
        // Do pause stuff
    }
}

また、 for が同じである限り、 s のActionListenerようなものを再利用できることも意味します...JMenuItemactionCommand

そうは言っても、このパラダイムに従わないことをお勧めします。通常はActions API を使用することをお勧めしますが、それは現在の状況に対して少し高度すぎるかもしれません。代わりに、Java の匿名クラスサポートを利用することをお勧めします。たとえば... .

startButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    }
});
stopButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        aJLabel.setText("Elapsed time is: "
                + (double) (aCalendar.getTimeInMillis() - start) / 1000);
    }
});
pauseButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Do pause stuff
    }
});

これにより、各ボタンの責任が単一の に分離され、ActionListener何が起こっているかを簡単に確認し、必要に応じて、恐れたり他のボタンに影響を与えたりすることなく変更できます。

また、ボタンへの参照を維持する必要がなくなります (ActionEvent getSourceプロパティを介して取得できるため) 。

于 2014-07-29T05:06:24.397 に答える
2

ActionListener を実装したくない場合は、次のように匿名リスナーをボタンに追加できます。

 JButton startButton = new JButton("Start");
 JButton stopButton = new JButton("Stop");
 JButton pauseButton = new JButton("Pause");
 startButton.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //start action logic here
        }
    });
 stopButton.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //stop action logic here
        }
    });
 pauseButton.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //action logic here
        }
    });

そして、このソリューションは機能する必要があります:)

于 2014-07-29T05:10:41.537 に答える
0

追加する必要があるのは、ボタンの作成後にこれだけです。

startButton.setActionCommand("Start");
stopButton.setActionCommand("Stop");
pauseButton.setActionCommand("Pause");

actionPerformed メソッドではこれを使用します。

switch(actionEvent.getActionCommand())
{
// cases
}
于 2014-07-29T09:05:35.497 に答える