我制作了一个代表卡片的JButton
阵列,其中有16个,4个4个。
如何使用键盘上的箭头而不是鼠标在JButton
之间浏览,如何通过按ENTER键而不是鼠标单击来“点击”JButton
?也许还有另一种方法,而不是使用JButton
s?
祝你好运!
答案 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?
如何使用键盘上的箭头而不是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()
;)