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

How to detect a modifier key-combination upon button click in java

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

我想实现相反的行为(即缩放 选择向外到完全缩小)另外,按住 shift 键,所以就像这个:

我知道除了 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
}