【问题标题】:Is it possible in java to capture arrow keys to work in a simmilar way Tab move the focus?是否可以在 java 中捕获箭头键以类似的方式工作 Tab 移动焦点?
【发布时间】:2017-03-15 10:12:34
【问题描述】:

我有一个 java 程序,其中包括一个 jpanel 中的按钮网格作为输入界面和一个显示结果的文本框。 我的目标是能够只用箭头键和空格来控制程序。

我知道我可以在每个按钮上编写一个事件,以检查在该按钮获得焦点时是否按下了左键,并将焦点传递给左侧的按钮(等等)。

但我想知道是否有其他方法。 我喜欢 Tab 和 shift+Tab 如何将焦点移动到上一个或下一个可聚焦对象,我想知道是否可以在没有每个箭头键组合的特定代码的情况下完成。

【问题讨论】:

  • Java 在 Swing 和 JavaFX 中支持开箱即用的选项卡焦点遍历。
  • 所以您想更改组合键以将焦点从选项卡切换到箭头键?

标签: java swing focus


【解决方案1】:

您为所有处理向上箭头的按钮编写了一个方法。在此方法中,您将当前按钮的位置存储在变量xy 中。

现在您遍历表单上的所有控件并检查它们的位置。现在您需要找到一个具有相同x 但较低y 值的控件(例如向上箭头)。

如果找不到这样的控件,则到达“最高”表单的控件。

注意:如果您的按钮不在直线行和列中,您需要寻找与当前控件值接近的控件,而不是完全相同的值。

希望我能帮到你。

【讨论】:

    【解决方案2】:

    我有一个 java 程序,它在 jpanel 中包含一个按钮网格...我的目标是能够只用箭头键和空格来控制程序。

    您可以使用Key Bindings。键绑定允许您将 Action 映射到 KeyStroke

    因此您可以在面板上创建键绑定来处理左/右箭头键。

    首先你需要一个动作:

    class TabAction extends AbstractAction
    {
        private boolean forward;
    
        public TabAction(boolean forward)
        {
            this.forward = forward;
        }
    
        public void actionPerformed(ActionEvent e)
        {
            if (forward)
                tabForward();
            else
                tabBackward();
        }
    
        private void tabForward()
        {
            KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            manager.focusNextComponent();
        }
    
        private void tabBackward()
        {
            KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            manager.focusPreviousComponent();
        }
    }
    

    现在您需要将Action 绑定到面板上的KeyStroke

    InputMap im = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    KeyStroke tab = KeyStroke.getKeyStroke("TAB");
    panel.getActionMap().put(im.get(tab), new TabAction(true));
    KeyStroke shiftTab = KeyStroke.getKeyStroke("shift TAB");
    im.put(shiftTab, shiftTab);
    panel.textArea.getActionMap().put(im.get(shiftTab), new TabAction(false));
    

    您通常会在包含按钮的面板的构造函数中调用上述代码,因此“面板”实际上就是“this”。

    阅读 How to Use KeyBindings 上的 Swing 教程部分了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多