在我的应用程序退出时,我想提示一点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));
}
以修饰符包含已按下的任何修饰键(如果有)的方式。
愿任何人帮助我吗?
答案 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;
}