我試圖通過觸發一個ActionEvent在面板中重新繪製一個簡單的按摩。如何從JPanel中觸發一個ActionEvent
我有一個MessagePanel
延伸JPanel
,我在其中定義的addActionListener
方法和processEvent
方法來處理事件:
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類,以便在單擊MessagePanel類的實例 時觸發ActionEvent。命名新類 MessagePanelWithActionEvent。使用Java applet測試它,只要消息面板被點擊了 ,就會在消息面板中顯示當前時間 ,如圖36.9所示。
是的。我正在做一個教科書問題(處理實現監聽器的事件)。問題清楚地表明,JPanel使用鼠標事件而不是行爲事件。因此它會要求您將操作事件實施到JPanel中。 –
@peeskillet:請在你的問題中逐字地發佈實際的作業。希望這是英文。 –
我在帖子的底部發布了問題 –