1

ActionEvent を起動して、パネルに単純なメッセージを再描画しようとしています。

メソッドとイベントを処理するメソッドを定義した、MessagePanelextends があります。JPaneladdActionListenerprocessEvent

import java.awt.Graphics;
import javax.swing.JPanel; 
import java.util.*;
import java.awt.event.*;

public class MessagePanel extends JPanel {
    private String message = new Date().toString();
    ArrayList<ActionListener> actionListenerList;

    public MessagePanel(String message) {
        this.message = message;
    }

    public void setMessage(String message){
        this.message = message;
    }

    public void addActionListener(ActionListener listener) {
        if (actionListenerList == null) {
            actionListenerList = new ArrayList<>(2);
        }
        if (!actionListenerList.contains(listener)) {
            actionListenerList.add(listener);
        }
    }

    public void removeActionListener(ActionListener listener) {
        if (actionListenerList != null &&
                actionListenerList.contains(listener)) {
            actionListenerList.remove(listener);
        }
    }

    public void processEvent(ActionEvent e) {
        ArrayList<ActionListener> list;

        synchronized(this) {
            if (actionListenerList == null) {
                return;
            }
            list = (ArrayList<ActionListener>)actionListenerList.clone();
        }

        for (int i = 0; i < list.size(); i++) {
            ActionListener listener = (ActionListener)list.get(i);
            listener.actionPerformed(e);
        }     
    }

    @Override
    protected void paintComponent(Graphics g){
         super.paintComponent(g);
         g.drawString(message, 0, 0);
    }
}

ここに私のテストクラスがあります:

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

public TestMessaePanel extends JFrame {
    MessagePanel messagePanel = new MessagePanel(new Date().toString());

    public TestMessagePanel() {
        add(messagePanel);
        messagePanel.setCentered(true);

        messagePanel.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                messagePanel.setMessage(new Date().toString());
            }
        });
    }

    public static void main(String[] args) {
        JFrame frame = new TestMessagePanelWithActionEvent();
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

パネルをクリックするたびに(他のイベントセットを使用せずに)パネルに現在の時間を再描画させようとしていますが、どのイベントが発生してprocessEventメソッドを呼び出すのかわかりません。processEvent他の場所でプロセスを実装できれば、が必要かどうかさえよくわかりません。

EDIT WITH TEXTBOOK PROBLEM (below)

(MessagePanel を有効にして ActionEvent を起動する) リスト 15.7 の MessagePanel クラスは JPanel のサブクラスです。MouseEvent、KeyEvent、および ComponentEvent を起動できますが、ActionEvent は起動できません。MessagePanel クラスのインスタンスがクリックされたときに ActionEvent を起動できるように、MessagePanel クラスを変更します。新しいクラスに MessagePanelWithActionEvent という名前を付けます。図 36.9 に示すように、メッセージ パネルがクリックされるたびにメッセージ パネルに現在の時刻を表示する Java アプレットでテストします。

4

1 に答える 1

2

パネルをクリックするたびにパネルに現在の時間を再描画させようとしています(他のイベントセットを使用せずに)

ActionListener は、Timer や AbstractButton など、それをトリガーするイベントに対してのみ使用されます。代わりに、マウス イベントに応答するコンポーネントには MouseListener を使用する必要があります。


課題を編集:

リスト 15.7 の MessagePanel クラスは JPanel のサブクラスです。MouseEvent、KeyEvent、および ComponentEvent を起動できますが、ActionEvent は起動できません。MessagePanel クラスのインスタンスがクリックされたときに ActionEvent を起動できるように、MessagePanel クラスを変更します。新しいクラスに MessagePanelWithActionEvent という名前を付けます。図 36.9 に示すように、メッセージ パネルがクリックされるたびにメッセージ パネルに現在の時刻を表示する Java アプレットでテストします。

  • MessagePanel に MouseListener を指定する必要があります。これは、mousePressed で ActionListener を呼び出すものです。
  • この MouseListener では、ActionEvent オブジェクトを作成する必要があります。これは課題であるため、その方法を説明するつもりはありませんが、代わりに ActionEvent API にアクセスして、このオブジェクトが必要とするものを確認し、試してみることをお勧めします。
  • 次に、呼び出すactionPerformed(...)必要があるすべての ActionListeners で作成した ActionEvent オブジェクトを使用して呼び出す必要があります。
于 2013-10-06T13:24:45.433 に答える