java - Swing:如果在数字键盘上按下数字,则 Ctrl+数字的操作无法正常工作

标签 java swing keyevent

我有一个 JTabbedPane,它必须在按下 Ctrl+Number 时切换选项卡(第一个选项卡为 Ctrl+1)。这是我的代码:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;

public class NumberSwitchTryout {

    public static void main(String[] args) {
        JFrame frm = new JFrame("Switch between tabs on Ctrl+Number");
        JTabbedPane tabber = new JTabbedPane();
        tabber.add("First", new JTextField("First"));
        tabber.add("Second", new JTextField("Second"));
        tabber.add("Third", new JTextField("Third"));
        tabber.add("Fourth", new JTextField("Fourth"));
        JPanel enclosingPanel = new JPanel(new BorderLayout());
        enclosingPanel.add(tabber);
        enclosingPanel.add(new JTextField("Field outside tabber"), BorderLayout.NORTH);
        frm.add(enclosingPanel);
        for (int i = 0; i < 4; i++) {
            ChangeTabAction act = new ChangeTabAction(tabber, i);
            KeyStroke stroke = KeyStroke.getKeyStroke("control " + (i + 1));
            enclosingPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(stroke, i);
            enclosingPanel.getActionMap().put(i, act);
        }
        frm.setSize(500, 500);
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

    private static class ChangeTabAction extends AbstractAction {
        private JTabbedPane tabber;
        private int index;
        public ChangeTabAction(JTabbedPane aTabber, int anIndex) {
            tabber = aTabber;
            index = anIndex;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            tabber.setSelectedIndex(index);
        }
    }
}

当按下普通数字键时,一切正常。但当按下键盘数字 block 上的按键时失败。一些想法,如何使其也适用于数字键盘(我需要它,因为我们的大多数客户主要使用数字键盘)?

背景:我有一些带有不同数量选项卡的 JTabbedPane(但总是少于 10 个)。所有这些 JTabbedPane 均在类中声明(类的每个实例一个 JTabbedPane)。此类具有方法addTab(String name, Component tab)。添加选项卡时,我需要注册一个关键操作以在封闭面板中切换到该选项卡。所以我现在寻找一个通用的解决方案。

最佳答案

我不完全确定这是否正确,但它可能有助于指导您找到解决方案。

如果我没记错的话,键盘顶部的数字和小键盘上的数字是不同的实体。我将在下面添加一个使用键盘监听器的示例,您可以将其集成到您的代码中。

例如:

if (e.getKeyCode() == KeyEvent.VK_NUMPAD2)
    System.out.println("NUMPAD 2 pressed.");

else if (e.getKeyCode() == KeyEvent.VK_2)
    System.out.println("Normal 2 pressed.");

希望这有帮助。

注意:您可以在此处找到 KeyEvent 文档: https://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html

关于java - Swing:如果在数字键盘上按下数字,则 Ctrl+数字的操作无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296371/

相关文章:

java - 如何在打开新框架时关闭主框架

java - 如何捕获 JTable 过滤器事件?

java - 带有背景图像的透明 JTextfield

javascript - 如何控制 javascript 或 jquery 中的 Tab 键行为?

java - 加载 JSON 文件,迭代条目并在 Java 中编辑它们

Java FileIO 错误未分析所有类

.net - 在 Win Forms NotifyIcon 上禁用 Alt-F4

Java 游戏 - 按下按键

java - 过滤列表后单击ListView Item

java - Vertx 测试部署 Verticle 的上下文问题