0

在我的应用程序中,当退出它时,我喜欢提示一个小 JOptionPane 以确保用户想要退出。我已经使用 JMenuItem 以及在单击 TrayIcon 时弹出的 MenuItem 实现了退出行为;以及在键入 ALT+F4 或关闭主窗口时。因此,所有退出处理都是通过包含必要的 actionPerformed 方法的 Action 完成的。此外,如果按下 SHIFT 键,我喜欢应用程序退出而不提示任何 JOptionPane;所以我放了这段代码摘录来做到这一点。

    if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK) {
        abandonApplication();
    }

我现在在关闭窗口时面临的问题是,我需要使用修饰符实例化一个 ActionEvent,但我不知道该怎么做。总之,我需要的是这个

private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
    ExitAction.getInstance().actionPerformed(new ActionEvent(evt,ActionEvent.ACTION_PERFORMED, "close", modifiers));
}                                  

修饰符包含已按下的任何修饰键(如果有)。

有人可以帮助我吗?

4

2 回答 2

0

另一个我认为更好的解决方案是在考虑使用键绑定时。此方法通知旨在包含修饰符的 int 变量。我认为是不言自明的。

/**
 * Describes what is going to be done when SHIFT key is pressed and released
 * while the JFrame that has the focus.
 * <p>
 * When the action pressed SHIFT is detected we get the modifiers and
 * immediately disable it in order to avoid useless action executions while 
 * SHIFT key is being pressed. Alternively, when released SHIFT is detected
 * we enable pressing SHIFT action again.
 * <p>
 * In this case we get the modifiers to pass them to the action done when 
 * window closign event is detected to check if the SHIFT key is pressed to
 * force exiting of the application without prompting anything.
 */
private void shiftKeyOperation() {
    final Action shiftPressedAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            modifiers = ae.getModifiers();
            setEnabled(false);
        }
    };

    final Action shiftReleasedAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            modifiers = ae.getModifiers();
            shiftPressedAction.setEnabled(true);
        }
    };
    JRootPane jRootPane = getRootPane(); //here we get the RootFrame from the JFrame
    ActionMap actionMap = jRootPane.getActionMap();
    InputMap inputMap = jRootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    final String SHIFT_KEY_PRESSED_ACTION = "shift_key_pressed";
    actionMap.put(SHIFT_KEY_PRESSED_ACTION, shiftPressedAction);
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, InputEvent.SHIFT_DOWN_MASK, false), SHIFT_KEY_PRESSED_ACTION);
    final String SHIFT_KEY_RELEASED_ACTION = "shift_key_released";
    actionMap.put(SHIFT_KEY_RELEASED_ACTION, shiftReleasedAction);
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, 0, true), SHIFT_KEY_RELEASED_ACTION);
    return;
}
于 2013-07-08T12:55:00.170 回答
0

在互联网上徘徊,我找到了适合我需要的解决方案。如下:

我定义了一个旨在包含修饰符的 int 变量。然后我注册一个 Key Pressed 一个 Key Released 侦听器,以完成以下操作:

private void formKeyPressed(java.awt.event.KeyEvent evt) {                                
    if (evt.getKeyCode() == KeyEvent.VK_SHIFT) {
        modifiers = evt.getModifiers();
    }
    return;
}  

private void formKeyReleased(java.awt.event.KeyEvent evt) {                                 
    if (evt.getKeyCode() == KeyEvent.VK_SHIFT) {
        modifiers = evt.getModifiers();
    }
    return;
}  

因此,在调用 ExitAction 时,我有所需的修饰符,并且退出操作在每种情况下都成功完成(菜单项、系统托盘、ALT-F4)。

我将不胜感激任何其他解决方案。

于 2013-07-01T10:47:22.907 回答