Java-有没有办法让MouseEvents获得模态对话框或者让非模态对话框等到输入?

时间:2013-04-22 23:18:19

标签: java swing dialog mouseevent modal-dialog

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

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使用模态对话框或者让非模态对话框等到输入?

提前感谢您的建议。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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.