java - 如何以编程方式确定不同键盘布局上 "Ctrl + Plus"和 "Ctrl + Minus"的正确击键?

标签 java swing keyboard-shortcuts keyboard-events keyboard-layout

我正在尝试绑定(bind) Ctrl + +Ctrl + - 来放大/缩小操作.

这个question解释说,在某些键盘布局上, +- 存在于主层上,而在其他键盘布局上,它们存在于辅助层上(您必须按 Shift 来输入)。另请参阅错误 42620446942481 .

目前看来我必须分析我想要支持的所有布局,并根据当前布局配置不同的按键绑定(bind),例如:

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;

public class KeyStrokeTest extends JFrame {
  public static void main(String[] args) throws Exception {

    JFrame frame = new JFrame();

    // en_US
    register(frame, "control shift EQUALS");
    register(frame, "control MINUS");

    // de_DE
    //    register(frame, "control PLUS");
    //    register(frame, "control MINUS");

    // de_CH
    //    register(frame, "control shift 1");
    //    register(frame, "control MINUS");

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(200, 200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.getRootPane().setFocusable(true);
    frame.getRootPane().requestFocusInWindow();
  }

  private static void register(JFrame frame, String keyStrokeDefinition) {
    KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeDefinition);
    String key = keyStrokeDefinition;
    frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key);
    frame.getRootPane().getActionMap().put(key, new TestAction(keyStrokeDefinition));
  }

  private static class TestAction extends AbstractAction {
    private String info;

    public TestAction(String info) {
      this.info = info;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      System.out.println("Action performed: " + info);
    }
  }
}

有没有办法以编程方式找出所有(或大多数)布局的 +- 的正确击键?

enter image description here

最佳答案

这包括通过任何方式输入“加号”,包括按下 CTRL 或 CTRL SHIFT:

register(f, "control MINUS");
register(f, "control SUBTRACT"); // minus on the numpad
// this covers typing a 'plus' by any means which include pressing down CTRL or CTRL SHIFT
f.getRootPane().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent evt) {
        String name = "control (shift) +";
        int mods = evt.getModifiersEx();
        if (mods == KeyEvent.CTRL_DOWN_MASK
                || mods == (KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)) {
            if (evt.getKeyChar() == '+') {
                System.out.println("Action performed: " + name);
            }
        }
    }
});

关于java - 如何以编程方式确定不同键盘布局上 "Ctrl + Plus"和 "Ctrl + Minus"的正确击键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67044917/

相关文章:

java - Eclipse,创建 Android 项目,不会导入 javax.swing

visual-studio-code - 在 VSCode 中使文件退出预览模式的键盘快捷键

Vim,如何在一个快捷键下映射两个任务?

java - 将对象引用传递给 Util 类

java - 在单独的 Eclipse 类中将 Row 添加到 DefaultTableModel

Java 扫描器问题

java - 当某些组件调整大小时,BoxLayout 中的组件会移动

visual-studio - Visual Studio 中 Eclipse 的 Ctrl+单击?

java - 无法从网页读取 html

java - 如何创建不返回响应的改进 API 方法调用