gpt4 book ai didi

java - 如何从 JPanel 触发 ActionEvent

转载 作者:行者123 更新时间:2023-11-30 04:12:50 25 4
gpt4 key购买 nike

我正在尝试通过触发 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)MessagePanel类 list 15.7 是 JPanel 的子类;它可以触发 MouseEvent,KeyEvent 和 ComponentEvent,但不是 ActionEvent。修改MessagePanel 类,以便在实例出现时触发 ActionEvent单击 MessagePanel 类的 。为新类命名MessagePanelWithActionEvent。使用显示的 Java 小程序对其进行测试每当消息面板打开时,消息面板中的当前时间单击,如图36.9所示。

最佳答案

I'm trying to have the panel repaint the current time with every click of the panel (without using any other event sets)

ActionListener 仅用于应该触发它的事件,例如计时器或 AbstractButton。您应该对响应鼠标事件的组件使用 MouseListener。

<小时/>

编辑您的作业:

The MessagePanel class in Listing 15.7 is a subclass of JPanel; it can fire a MouseEvent, KeyEvent, and ComponentEvent, but not an ActionEvent. Modify the MessagePanel class so that it can fire an ActionEvent when an instance of the MessagePanel class is clicked. Name the new class MessagePanelWithActionEvent. Test it with a Java applet that displays the current time in a message panel whenever the message panel is clicked, as shown in Figure 36.9.

  • 您必须为 MessagePanel 提供一个 MouseListener,该监听器在 mousePressed 上调用您的 ActionListener。
  • 在此 MouseListener 中,您必须创建一个 ActionEvent 对象。由于这是一项作业,因此我不会向您展示如何执行此操作,而是建议您转到 ActionEvent API 以查看该对象需要什么,然后尝试一下。
  • 然后,您必须使用刚刚在需要调用的任何 ActionListener 上创建的 ActionEvent 对象来调用 actionPerformed(...)

关于java - 如何从 JPanel 触发 ActionEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19209308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com