使用箭头键浏览JButtons

时间:2011-08-15 14:15:34

标签: java swing user-interface keyboard jbutton

我制作了一个代表卡片的JButton阵列,其中有16个,4个4个。 如何使用键盘上的箭头而不是鼠标在JButton之间浏览,如何通过按ENTER键而不是鼠标单击来“点击”JButton?也许还有另一种方法,而不是使用JButton s?

祝你好运!

6 个答案:

答案 0 :(得分:7)

我创建了一个解决方案,允许您使用箭头键导航按钮并使用空格激活它们并输入。

以下是所有代码。没有提供任何评论,如果您有任何问题,请告诉我。

import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonPane extends JPanel {

   private JButton[][] buttons;

   public ButtonPane(int row, int col) {
      super(new GridLayout(row, col));
      buttons = new JButton[row][col];
      for (int i = 0; i < buttons.length; i++) {
         for (int j = 0; j < buttons[i].length; j++) {
            final int curRow = i;
            final int curCol = j;
            buttons[i][j] = new JButton(i + ", " + j);
            buttons[i][j].addKeyListener(enter);
            buttons[i][j].addKeyListener(new KeyAdapter() {
               @Override
               public void keyPressed(KeyEvent e) {
                  switch (e.getKeyCode()) {
                  case KeyEvent.VK_UP:
                     if (curRow > 0)
                        buttons[curRow - 1][curCol].requestFocus();
                     break;
                  case KeyEvent.VK_DOWN:
                     if (curRow < buttons.length - 1)
                        buttons[curRow + 1][curCol].requestFocus();
                     break;
                  case KeyEvent.VK_LEFT:
                     if (curCol > 0)
                        buttons[curRow][curCol - 1].requestFocus();
                     break;
                  case KeyEvent.VK_RIGHT:
                     if (curCol < buttons[curRow].length - 1)
                        buttons[curRow][curCol + 1].requestFocus();
                     break;
                  default:
                     break;
                  }
               }
            });
            add(buttons[i][j]);
         }
      }
   }

   private KeyListener enter = new KeyAdapter() {
      @Override
      public void keyTyped(KeyEvent e) {
         if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            ((JButton) e.getComponent()).doClick();
         }
      }
   };

   public static void main(String[] args) {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.add(new ButtonPane(4, 4));
      f.pack();
      f.setVisible(true);
   }
}

要运行此功能,只需粘贴到名为ButtonPane的类中。

这里重要的一点就是在调用箭头键时在正确的requestFocus()上调用JButton。当按下Enter键时,我还注册了额外的KeyListener

答案 1 :(得分:2)

只需按键盘上的 Enter ...确保使用

button.addActionListener(yourActionListener);

而不是创建鼠标侦听器。

哦,我忘记了另一部分。 :d

要进行浏览,您可以使用button.requestFocus()将焦点更改为特定按钮。

以下是一些示例代码:

final JButton matrix[][] = new JButton[4][4];
for (int x = 0; x < 4; ++x)
{
    for (int y = 0; y < 4; ++y)
    {
        final int xx = x;
        final int yy = y;
        JButton b = new JButton();
        b.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyPressed(KeyEvent e)
            {
                int c = e.getKeyCode();
                if (c == KeyEvent.VK_UP)
                {
                    // Oops, corrected (xx > 0) to (yy > 0)
                    if (yy > 0) matrix[xx][yy-1].requestFocus();
                } else if (c == KeyEvent.VK_DOWN)
                {
                    if (yy < 3) matrix[xx][yy+1].requestFocus();
                }
                // Add the other directions here
            }
        });

        matrix[x][y] = b;
    }

}

答案 2 :(得分:2)

请参阅key bindings

component[0][0].getInputMap().put(KeyStroke.getKeyStrokeForEvent(KeyEvent.VK_RIGHT),
                        "moveRight");
component[0][0].getActionMap().put("moveRight", new Action() {
             @Override public void actionPerformed() {
                  component[0][1].requestFocus();
             }
});

我不确定代码是否正确,但你明白了。 你必须做36个才能获得所有按钮之间的所有方向, 所以你可能想写一些循环来自动化这个过程。

答案 3 :(得分:2)

  

如何通过按ENTER键而不是鼠标点击来“点击”JButton?

请参阅Enter Key and Button

  

如何使用键盘上的箭头而不是mous

在JButton中浏览

对于右/左箭头键,您可以将这些KeyStrokes添加到焦点遍历键。请参阅How to Use the Focus Subsystem

对于向上/向下键,您需要创建自定义Action,然后将Action绑定到KeyStroke。见How to Use Key Bindings。关于How to Use Actions的教程中还有一节。

答案 4 :(得分:1)

使用焦点子系统。

这应该让您开始使用箭头键选择组件。它是未经测试的,所以请原谅任何错误:D

假设你的按钮数组在JFrame中,

JFrame frame = new JFrame();
//pseudo-method to add your buttons to the frame in the appropraite order.
frame.addButtonsToPanel(buttonArray, frame); 

//gets the default forward traversal keys (tab)
Set forwardKeys = frame.getFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); 

// your own set of forward traversal keys
Set newForwardKeys = new HashSet(forwardKeys); 

// add the RIGHT ARROW key 
newForwardKeys.add(KeyStroke.getKeyStroke(
    KeyEvent.VK_RIGHT, 0)); 

//apply your  new set of keys
frame.setFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, 
    newForwardKeys); 

//gets the default backward traversal keys (shift-tab)
Set backwardKeys = frame.getFocusTraversalKeys(
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); 

// your own set of backward traversal keys
Set newBackwardKeys = new HashSet(backwardKeys); 

// add the LEFT ARROW key 
newBackwardKeys.add(KeyStroke.getKeyStroke(
    KeyEvent.VK_LEFT, 0)); 

//apply your  new set of keys
frame.setFocusTraversalKeys(
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, 
    newBackwardKeys); 

p.s有关详细信息,请参阅How to Use the Focus Subsystem

答案 5 :(得分:0)

我最近在我的GUI实用程序类中添加了这个小gem。它只是将新键添加到[tab]焦点更改的同一系统中:

public static void addUpDownToTraversalKeys(Component c)
{   
    addTraversalKeys(c, KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, KeyEvent.VK_DOWN);
    addTraversalKeys(c, KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, KeyEvent.VK_UP);
}

public static void addLeftRightToTraversalKeys(Component c)
{   
    addTraversalKeys(c, KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, KeyEvent.VK_RIGHT);
    addTraversalKeys(c, KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, KeyEvent.VK_LEFT);
}

public static void addTraversalKeys(Component c, int keysetId, int...keyCodes)
{   
    HashSet<AWTKeyStroke> newKeys = 
        new HashSet<AWTKeyStroke>(
                c.getFocusTraversalKeys(keysetId));
    for (int keyCode : keyCodes)
        newKeys.add(AWTKeyStroke.getAWTKeyStroke(keyCode, 0));
    c.setFocusTraversalKeys(keysetId,newKeys);
}

添加到我的GuiUtilities类中,只需在框架的构造函数中调用GuiUtilities.addUpDownToTraversalKeys(this);,就可以使用向上和向下箭头键遍历所有元素。请注意,如果您有文本区域,则不建议使用addLeftRightToTraversalKeys();)