我需要将一些事件发送到 Swing 中的组件,因此它的处理方式就像任何用户生成的标准 Swing 事件一样。
基本上,类似于宏记录器,然后是 JEditorPane 的执行器。 但我需要对生成的事件有更多的控制。
所以,假设我有一个编辑,我想:
显而易见的事情是获取
EventQueue
并向其发布事件。这只会将事件添加到队列中,该队列将在 EDT 上轮流调度。
java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
昨天有人声称 Opera 和 Safari 做自己的事情,不向不受信任的代码授予所需的权限。
直接的方法是致电
Component.dispatchEvent
。
如果您正在寻找标准 GUI 事件,那么您需要 java.awt.Robot
如果您想要定义自己的事件,则必须对需要接收这些事件的 GUI 类进行子类化(或者更好的是,为它们创建一个外部控制器),定义一个事件类,然后分派事件。您可以使用 java.beans.EventHandler 来调度、创建您自己的处理程序类(我发现有时更有用),或将您的事件(取决于它们如何继承)注入系统事件队列(不能找到执行该操作的类...我以为它是 Toolkit)。
但是,这些我都不会做。您所描述的内容(宏记录器)应该使用控制器来实现,该控制器生成/提供一系列特定于应用程序的操作消息(查看命令模式)。
我相信你必须构造一个事件的实例,然后调用
java.awt.EventQueue.dispatchEvent(event)
将事件源设置为所需的组件。
这是 JComponent 向 JFrame 窗口发送 虚拟 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.
}
}
});
this.dispatchEvent(new KeyEvent(this, KeyEvent.KEY_PRESSED, 100, 0, KeyEvent.VK_UNDEFINED, KeyEvent.CHAR_UNDEFINED)); //dispatch event to main window.
仅此而已!