java中如何在点击按钮时检测修改器键组合

java中如何在点击按钮时检测修改器键组合,java,swing,click,modifier,Java,Swing,Click,Modifier,我在Java Swing应用程序中有一个按钮,用于缩放到所选内容。我实现了3种点击方式: 单击:使用分步动画缩放到所选内容 选项单击:向选择方向执行单个缩放步骤 命令单击:突然缩放到完全选择 另外,按住shift键时,我希望实现反向行为(即从选择向外缩放到完全缩小),因此如下所示: 按住shift键单击:使用分步动画完全缩小 shift选项单击:是否从选择中执行单个缩放步骤 shift命令单击:突然缩放到完全缩小 除了shift选项单击和shift命令单击之外,我知道如何执行所有操作。例

我在Java Swing应用程序中有一个按钮,用于缩放到所选内容。我实现了3种点击方式:

  • 单击:使用分步动画缩放到所选内容
  • 选项单击:向选择方向执行单个缩放步骤
  • 命令单击:突然缩放到完全选择
另外,按住shift键时,我希望实现反向行为(即从选择向外缩放到完全缩小),因此如下所示:

  • 按住shift键单击:使用分步动画完全缩小
  • shift选项单击:是否从选择中执行单个缩放步骤
  • shift命令单击:突然缩放到完全缩小
除了shift选项单击和shift命令单击之外,我知道如何执行所有操作。例如,以下是我如何进行单步放大:

int stepMask = InputEvent.ALT_MASK;
if((e.getModifiers() & InputEvent.ALT_MASK) == stepMask) {
    //do the single-step zoom
}

但我不知道如何通过单击来组合键。我尝试过的所有方法都只适用于一个修改键。如何在单击按钮时检测按键组合?

modifiers值是一个按位or'd值,包含与事件相关的所有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
}

为什么不将其简化为if((e.getModifiers()&(InputEvent.ALT_MASK | InputEvent.SHIFT_MASK)!=0){//code for event}@Gordon,因为如果按住alt或shift,该代码将执行。不,不会。这是一个掩码。对于匿名downvoter,您愿意发表意见吗?我在实践中使用了该方法。它工作得很好,IMO可读性更高。20多行代码,在其他人必须触摸代码的任何事件中都使用自定义方法记得在他们第一次看到它时使用或查找它,与一行
if((e.getModifiers()&(InputEvent.ALT_MASK | InputEvent.SHIFT_MASK)!=0)
相比,它本身是完全可读的?这不像InputEvent常量的名称很混乱。您的版本“可读性更高”吗?在我看来,这就像是为了样板而做的样板。非常欢迎你这么认为。:)在我相对较大的Swing应用程序中,我在很多地方使用checkFor函数(注意,在我的回答中,我写道“如果你有很多这样的功能。”我发现它们中的每一个都更具可读性,也更容易获得正确的语法,因此额外的二十行(我从来没有接触过)很容易就能为自己买单。此外,每次调用checkFor都比等效的“raw”短几个字符方法,更不用说它不包括任何按位操作,我发现这很容易出错。花了十分钟写这二十行之后,每次我需要检查修改键时,我就节省了三十秒。