如何在 java 中单击按钮时检测修改键组合
How to detect a modifier key-combination upon button click in java
我在 Java Swing 应用程序中有一个用于缩放到所选内容的按钮。我实现了 3 种点击方式:
- 单击:使用逐步动画缩放到选区
- option-click: 对选择做一个缩放步骤
- 命令单击:突然缩放到完整选择
我想实现相反的行为(即缩放 从 选择向外到完全缩小)另外,按住 shift 键,所以就像这个:
- shift-click:使用逐步动画完全缩小
- shift-option-click:从选区开始缩放一步
- shift-command-click:突然缩放到完全缩小
我知道除了 shift-option-click 和 shift-command-click 之外的所有操作。例如。这是我进行单步放大的方法:
int stepMask = InputEvent.ALT_MASK;
if((e.getModifiers() & InputEvent.ALT_MASK) == stepMask) {
//do the single-step zoom
}
但我不知道如何通过单击进行组合键。我尝试过的所有内容都只适用于单个修改键。如何在单击按钮时检测组合键?
修饰符值是一个按位或值,包含与事件相关的所有 InputEvent 修饰符。要识别特定修饰符,请检查您认为给定逻辑所需的所有修饰符:
if((e.getModifiers() & InputEvent.ALT_MASK) != 0 && (e.getModifiers() & InputEvent.SHIFT_MASK) != 0 ) {
//code for event
}
有一种更优雅的方法。首先,将组合掩码定义为常量:
private static final int SHIFT_OPTION_MASK = InputEvent.ALT_MASK | InputEvent.SHIFT_MASK;
然后,在按钮的 ActionListener 中,执行以下操作:
if((e.getModifiers() & SHIFT_OPTION_MASK) == SHIFT_OPTION_MASK) {
// code for event
}
如果你有很多这些,你可以更进一步。首先定义一个枚举:
import java.awt.event.InputEvent;
public enum ModifierKey {
ALT(InputEvent.ALT_MASK),
SHIFT(InputEvent.SHIFT_MASK),
CONTROL(InputEvent.CTRL_MASK),
COMMAND(InputEvent.META_MASK);
// add more enum values here as needed
public static boolean checkFor(ActionEvent e, ModifierKey... expectedModifiers) {
int expectedModifierMask = 0;
for (ModifierKey expectedModifier : expectedModifiers) {
expectedModifierMask |= expectedModifier.getMask();
}
return (e.getModifiers() & expectedModifierMask) == expectedModifierMask;
}
private final int mask;
ModifierKey(int mask) {
this.mask = mask;
}
public int getMask() {
return mask;
}
}
然后,在您的 actionListener 中,您改为这样做:
import static ModifierKey.*;
...
if (checkFor(e, OPTION, SHIFT)) {
// code for event
}
我在 Java Swing 应用程序中有一个用于缩放到所选内容的按钮。我实现了 3 种点击方式:
- 单击:使用逐步动画缩放到选区
- option-click: 对选择做一个缩放步骤
- 命令单击:突然缩放到完整选择
我想实现相反的行为(即缩放 从 选择向外到完全缩小)另外,按住 shift 键,所以就像这个:
- shift-click:使用逐步动画完全缩小
- shift-option-click:从选区开始缩放一步
- shift-command-click:突然缩放到完全缩小
我知道除了 shift-option-click 和 shift-command-click 之外的所有操作。例如。这是我进行单步放大的方法:
int stepMask = InputEvent.ALT_MASK;
if((e.getModifiers() & InputEvent.ALT_MASK) == stepMask) {
//do the single-step zoom
}
但我不知道如何通过单击进行组合键。我尝试过的所有内容都只适用于单个修改键。如何在单击按钮时检测组合键?
修饰符值是一个按位或值,包含与事件相关的所有 InputEvent 修饰符。要识别特定修饰符,请检查您认为给定逻辑所需的所有修饰符:
if((e.getModifiers() & InputEvent.ALT_MASK) != 0 && (e.getModifiers() & InputEvent.SHIFT_MASK) != 0 ) {
//code for event
}
有一种更优雅的方法。首先,将组合掩码定义为常量:
private static final int SHIFT_OPTION_MASK = InputEvent.ALT_MASK | InputEvent.SHIFT_MASK;
然后,在按钮的 ActionListener 中,执行以下操作:
if((e.getModifiers() & SHIFT_OPTION_MASK) == SHIFT_OPTION_MASK) {
// code for event
}
如果你有很多这些,你可以更进一步。首先定义一个枚举:
import java.awt.event.InputEvent;
public enum ModifierKey {
ALT(InputEvent.ALT_MASK),
SHIFT(InputEvent.SHIFT_MASK),
CONTROL(InputEvent.CTRL_MASK),
COMMAND(InputEvent.META_MASK);
// add more enum values here as needed
public static boolean checkFor(ActionEvent e, ModifierKey... expectedModifiers) {
int expectedModifierMask = 0;
for (ModifierKey expectedModifier : expectedModifiers) {
expectedModifierMask |= expectedModifier.getMask();
}
return (e.getModifiers() & expectedModifierMask) == expectedModifierMask;
}
private final int mask;
ModifierKey(int mask) {
this.mask = mask;
}
public int getMask() {
return mask;
}
}
然后,在您的 actionListener 中,您改为这样做:
import static ModifierKey.*;
...
if (checkFor(e, OPTION, SHIFT)) {
// code for event
}