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

Swing: Action for Ctrl+Number does not work properly if number is pressed on numpad

我有一个 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);
        }
    }
}

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

背景:我有一些带有不同数量选项卡的 JTabbedPane(但总是少于 10 个)。所有这些 JTabbedPane 都在 class 中声明(每个 class 实例一个 JTabbedPane)。这个 class 有方法 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