Control-Option-Space键,使用Voiceover实用程序在MAC中的JCombobox中打开Popup

时间:2012-11-16 05:25:55

标签: java macos swing jcombobox key-bindings

我有一个JComboBox,其中包含多个值。如何检测按键control-option-space以在MAC中打开JComboBox的弹出窗口?

1 个答案:

答案 0 :(得分:3)

除了标准control-option-space密钥之外,您是否还需要space密钥绑定,这一点尚不清楚。在任何一种情况下,您都可以使用如下所示的绑定来唤起aquaSpacePressed操作。有关详细信息,请参阅如何使用键绑定

combo.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
    KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
        KeyEvent.ALT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK),
    "aquaSpacePressed");

因为这是特定于Mac的,所以您可能希望使用诸如此类的谓词:

System.getProperty("os.name").startsWith("Mac OS X")

附录:下面的sscce用于测试修订问题中的情景。

附录:由于原因不明确,启用System Preferences > Speech > Text to Speech会抢占control-option-space绑定。作为替代方案,您可以绑定到标准Action"spacePopup",如下面的修订示例所示。

import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

/**
 * @see http://stackoverflow.com/a/13412208/230513
 */
public class ComboKeyTest extends JPanel {

    public ComboKeyTest() {
        JComboBox cpmbo = new JComboBox();
        cpmbo.addItem("One");
        cpmbo.addItem("Two");
        cpmbo.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
            KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
            KeyEvent.ALT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK),
            "spacePopup");

        this.add(cpmbo);
    }

    private void display() {
        JFrame f = new JFrame("NewJavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ComboKeyTest().display();
            }
        });
    }
}