我试着用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类的实例时触发MessagePanel。命名新的类MessagePanelWithActionEvent。当单击消息面板时,使用Java测试它,它在消息面板中显示当前时间,如图36.9所示。
发布于 2013-10-06 13:24:45
我试图让面板重新绘制当前时间,每次单击面板(不使用任何其他事件集)
ActionListener只用于应该触发它的事件,例如计时器或AbstractButton。相反,您应该对响应鼠标事件的组件使用MouseListener。
编辑您的作业:
清单15.7中的MessagePanel类是JPanel的子类;它可以触发MouseEvent、KeyEvent和ComponentEvent,但不能触发ActionEvent。修改MessagePanel类,使其能够在单击MessagePanel类的实例时触发MessagePanel。命名新的类MessagePanelWithActionEvent。当单击消息面板时,使用Java测试它,它在消息面板中显示当前时间,如图36.9所示。
actionPerformed(...)上创建的ActionEvent对象调用ActionListeners。https://stackoverflow.com/questions/19209308
复制相似问题