【发布时间】:2015-07-16 08:17:49
【问题描述】:
我在 Java Swing 应用程序中有一个定制的 JButton。
它会根据鼠标事件改变它的外观。
MouseEvent.MOUSE_ENTERED - 将触发按钮的悬停图像。 MouseEvent.MOUSE_PRESSED - 将触发按下的图像。
MouseEvent.MOUSE_RELEASED - 将前景变为灰色并禁用按钮。
实际点击鼠标效果很好。
我想添加对按 ENTER 键的支持。
简单地调用button.doClick() 并没有经历悬停-按下-发布周期,而是简单地跳转到发布事件。
所以我有这个简短而有效的代码来做这件事。
InputMap im = workspacePnl.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = workspacePnl.getActionMap();
im.put(KeyStroke.getKeyStroke("ENTER"), "connect");
am.put("connect", new ConectAction());
private class ConectAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent ev) {
simulateClick();
}
以及有问题的代码:
public void simulateClick() {
MouseEvent evt;
evt = new MouseEvent(connectBtn,
MouseEvent.MOUSE_ENTERED, 1, 0, 0, 0, 1, false);
connectBtn.dispatchEvent((AWTEvent) evt);
//CommonUtil.sleep(300);
evt = new MouseEvent(connectBtn,
MouseEvent.MOUSE_PRESSED, 8, 0, 0, 0, 1, false);
connectBtn.dispatchEvent((AWTEvent) evt);
//CommonUtil.sleep(300);
evt = new MouseEvent(connectBtn,
MouseEvent.MOUSE_RELEASED, 20, 0, 0, 0, 1, false);
connectBtn.dispatchEvent((AWTEvent) evt);
}
我试图让 ENTER 按下通过相同的路径:
触发一个 MOUSE_ENTERED 事件,该事件将改变按钮的悬停外观,然后是 MOUSE_PRESSED 和 MOUSE_RELEASED。
但我只看到最后一个事件效果。就好像我只是单独触发最后一个事件,它缺乏交互式软件的活力。
我尝试(可以看出已注释掉)在每次事件触发后让线程进入睡眠状态,但它没有效果。
如果我尝试触发其他两个事件中的每一个,它们本身就会在屏幕上引人注目。是批处理把事情搞砸了。
我怎样才能一个接一个地触发一系列dispatchEvents,这些事件都会被用户注意到?我怎样才能让程序等待当前的 dispatchEvent 工作,然后再大步前进到下一个?
任何帮助或见解将不胜感激。
【问题讨论】:
-
"MouseEvent.MOUSE_ENTERED - 将触发按钮的悬停图像。" -
JButton#setRolloverEnabled&JButton#setRolloverIcon -
"MouseEvent.MOUSE_PRESSED - 将触发按下的图像。" -
JButton#setRolloverSelectedIcon&/或JButton#setSelectedIcon -
public void simulateClick() {...doClick有什么问题吗? -
这并不能解决我的问题。确实,我可以使用这种方法来更好地自定义按钮(也许。我没有尝试过,所以我不知道这是否会引入错误),但我仍然需要在没有帮助的情况下手动调用这些事件物理鼠标,以创建实际按下的错觉。我写了 doClick 什么也没做。
-
实际上,它在大多数情况下都是如此。根据您的需要,您可能需要在
JButton的ButtonModel上使用ChangeListener来修改“选定图标”,假设您希望在按下[Enter] 按钮时显示“选定图标”。doClick对您不起作用的原因是您没有监控按钮模型的更改
标签: java swing mouseevent jbutton dispatchevent