Swing:如何创建事件并将其分派给组件?

问题描述 投票:0回答:4

我需要将一些事件发送到 Swing 中的组件,因此它的处理方式就像任何用户生成的标准 Swing 事件一样。

基本上,类似于宏记录器,然后是 JEditorPane 的执行器。 但我需要对生成的事件有更多的控制。

所以,假设我有一个编辑,我想:

  1. 捕获发送给它的所有事件,此时,我可以将它们存储在列表中、磁盘上或其他任何位置..
  2. 稍后能够参加这些赛事
  3. 理想的情况是允许用户编辑包含以下内容的命令:
    “键入键 A,选择行,删除所选内容,向上光标,行开始...”
java swing events
4个回答
6
投票

显而易见的事情是获取

EventQueue
并向其发布事件。这只会将事件添加到队列中,该队列将在 EDT 上轮流调度。

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);

昨天有人声称 Opera 和 Safari 做自己的事情,不向不受信任的代码授予所需的权限。

直接的方法是致电

Component.dispatchEvent


3
投票

如果您正在寻找标准 GUI 事件,那么您需要 java.awt.Robot

如果您想要定义自己的事件,则必须对需要接收这些事件的 GUI 类进行子类化(或者更好的是,为它们创建一个外部控制器),定义一个事件类,然后分派事件。您可以使用 java.beans.EventHandler 来调度、创建您自己的处理程序类(我发现有时更有用),或将您的事件(取决于它们如何继承)注入系统事件队列(不能找到执行该操作的类...我以为它是 Toolkit)。

但是,这些我都不会做。您所描述的内容(宏记录器)应该使用控制器来实现,该控制器生成/提供一系列特定于应用程序的操作消息(查看命令模式)。


2
投票

我相信你必须构造一个事件的实例,然后调用

java.awt.EventQueue.dispatchEvent(event)

将事件源设置为所需的组件。


0
投票

这是 JComponent 向 JFrame 窗口发送 虚拟 KeyEvent 的示例:

  1. 对于 JFrame 窗口,创建 JComponent 并注册 KeyEvent 监听器:
JPanel plContent = new JSubPanel();
plContent.addKeyListener(new KeyAdapter() { //receive messge from JPanel
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                if (e.getSource() == plContent) {//update main windows
                    updateWindowTips(); //for example else.
                }
            }
        });
  1. 在 JSubPanel 类中,执行以下操作:
this.dispatchEvent(new KeyEvent(this, KeyEvent.KEY_PRESSED, 100, 0, KeyEvent.VK_UNDEFINED, KeyEvent.CHAR_UNDEFINED)); //dispatch event to main window.

仅此而已!

© www.soinside.com 2019 - 2024. All rights reserved.