1

我正在开发一个旨在跟踪赛跑的程序。该程序设置为在任何时候右键单击(尽管这可能会更改)将指示跑步者已经通过了终点线。这很重要,这样您就可以在任何时候做事并仍然将跑步者标记为通过。要完成比赛并编译结果,有一个按钮。为了防止误点击过早停止计时器,我有一个对话框在计时器仍在运行时进行确认。此对话框也可以右键单击以将跑步者标记为通过。我有一个方法可以从对话框中获取输入作为布尔值。

public static boolean showDialog(Frame parent, boolean modal,String text,RacePanel r)
    {
        ConfirmBox c=new ConfirmBox(parent,modal,text);//this makes the dialog
        for(Component comp:c.getComponents())//this adds a listener for right-click events, to record passing runners
            r.addListener(comp);
        c.setVisible(true);
        return c.yes;//yes is the boolean that should be returned
    }

我最初有对话框模式,因此该setVisible方法将等待对话框关闭。但是,这使程序忽略了屏幕其余部分上的鼠标点击。当我将其设置为非模态时,此 showDialog 方法立即返回,始终为 false。我实际上并不关心对话框是否是模态的。

有没有办法通过模态对话框获取 MouseEvents 或使非模态对话框等到输入?

预先感谢您的建议。

4

2 回答 2

1

您将需要使用侦听器来侦听对话框类状态的变化。例如,WindowListener 可以监听对话框的窗口关闭。如果要侦听对话框类中的其他状态更改,请考虑使用 PropertyChangeListener 创建“绑定”属性或字段。

于 2013-04-22T23:21:03.243 回答
1

几个解决方案:

  • 使用热键做出反应 - 会更快。所以F11表示停止比赛,用F12确认。并且 F9 表示跑步者已经通过了终点线有类似的 JNI 包http://code.google.com/p/jintellitype/

  • 让用户单击按钮并键入一个键或世界,例如“结束”,示例参见http://code.google.com/p/baby-smash/source/browse/src/quick/KeyBoardListen.java不喜欢一个对话框,因为它们需要时间来渲染并且可以增加到计时器。

  • 如果您必须使用对话框,请实现您自己的。在该类中获取主类(或控制器实现的接口)的实例,然后在窗口被操作时调用控制器上的方法(是或否按下或窗口关闭 - 默认)。在窗口关闭时不要关闭窗口而只是隐藏它。这意味着您下次可以更快地展示它。您还可以在启动时加载此类以使其在后台准备好

  • 如果您只想要鼠标事件可以尝试扩展 JFrame 然后覆盖(java.awt.Component 的 javadoc):protected void processMouseEvent(MouseEvent e)

通过将鼠标事件分派到任何已注册的 MouseListener 对象来处理此组件上发生的鼠标事件。

除非为此组件启用鼠标事件,否则不会调用此方法。发生以下情况之一时启用鼠标事件:

A MouseListener object is registered via addMouseListener.
Mouse events are enabled via enableEvents. 
于 2013-04-23T00:59:24.233 回答