使用箭头键浏览JButtons

我制作了一个代表卡片的JButtonarrays,其中有16个,4个4个。如何用键盘上的箭头而不是鼠标在JButton浏览,如何通过按下“点击” JButton输入而不是鼠标点击? 也许还有另一种方法可以做到这一点,而不是使用JButton

最好的祝福!

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

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

 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的类中。

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

请参阅键绑定 。

 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个以获取所有按钮之间的所有方向,因此您可能希望编写一些循环来自动执行该过程。

只需按键盘上的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; } } 

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

请参阅输入键和按钮

如何用键盘上的箭头而不是mous浏览JButton

对于右/左箭头键,您可以将这些KeyStrokes添加到焦点遍历键。 请参见如何使用焦点子系统 。

对于向上/向下键,您需要创建自定义Action,然后将Action绑定到KeyStroke。 请参见如何使用键绑定 。 “ How to Use Actions ”教程中还有一节。

使用Focus子系统。

这应该让您开始使用箭头键选择组件。 没有经过测试,请原谅任何错误: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); 

ps有关详细信息,请参阅如何使用Focus子系统

我最近在我的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 newKeys = new HashSet( c.getFocusTraversalKeys(keysetId)); for (int keyCode : keyCodes) newKeys.add(AWTKeyStroke.getAWTKeyStroke(keyCode, 0)); c.setFocusTraversalKeys(keysetId,newKeys); } 

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