首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从ActionEvent中触发JPanel

如何从ActionEvent中触发JPanel
EN

Stack Overflow用户
提问于 2013-10-06 13:20:33
回答 1查看 3.2K关注 0票数 1

我试着用ActionEvent重新画一个简单的按摩面板。

我有一个扩展MessagePanelJPanel,其中定义了一个addActionListener方法和一个处理事件的processEvent方法:

代码语言:javascript
运行
复制
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);
    }
}

这是我的考试课:

代码语言:javascript
运行
复制
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,是否可以在其他地方实现这个过程。

代码语言:javascript
运行
复制
EDIT WITH TEXTBOOK PROBLEM (below)

(启用MessagePanel来激发ActionEvent)清单15.7中的MessagePanel类是JPanel的一个子类;它可以触发MouseEvent、KeyEvent和ComponentEvent,但不能触发ActionEvent。修改MessagePanel类,使其能够在单击MessagePanel类的实例时触发MessagePanel。命名新的类MessagePanelWithActionEvent。当单击消息面板时,使用Java测试它,它在消息面板中显示当前时间,如图36.9所示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-06 13:24:45

我试图让面板重新绘制当前时间,每次单击面板(不使用任何其他事件集)

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

编辑您的作业:

清单15.7中的MessagePanel类是JPanel的子类;它可以触发MouseEvent、KeyEvent和ComponentEvent,但不能触发ActionEvent。修改MessagePanel类,使其能够在单击MessagePanel类的实例时触发MessagePanel。命名新的类MessagePanelWithActionEvent。当单击消息面板时,使用Java测试它,它在消息面板中显示当前时间,如图36.9所示。

  • 您必须给您的MessagePanel一个MouseListener,它在mousePressed上称为ActionListener。
  • 在这个MouseListener中,您必须创建一个ActionEvent对象。因为这是一项任务,所以我不打算向您展示如何做到这一点,而是建议您到ActionEvent API上看看这个对象需要什么,并尝试一下。
  • 然后,您必须使用您刚刚在任何需要调用的actionPerformed(...)上创建的ActionEvent对象调用ActionListeners。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19209308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档