使用修饰符(如果有)实例化ActionEvent

时间:2013-06-27 11:03:19

标签: java actionevent

在我的应用程序退出时,我想提示一点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));
}                                  

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

愿任何人帮助我吗?

2 个答案:

答案 0 :(得分:0)

在整个互联网中游荡我找到了一个适合我需求的解决方案。它如下:

我定义了一个旨在包含修饰符的int变量。然后我注册了一个Key Pressed a 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时,我有所需的修饰符,并且在每个条件下都成功完成了退出操作(MenúItem,System Tray,ALT-F4)。

我很感激任何其他解决方案。

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