我创建了一个二维 JPanel 表,我的第一个单元格上有一个 JButton。我想用我的箭头键将按钮移动到我的表的边界内。我必须将 KeyListener 放在每个单元格或我的按钮上?也许你会觉得我的问题很愚蠢,但我需要一些关于 KeyListener 的帮助。谢谢!
这是我写的代码!
public class MyFrame extends JFrame {
JPanel [][] innerCells;
public MyFrame() {
JFrame fr = new JFrame("Final Exams");
fr.setSize(800, 600);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setVisible(true);
fr.setLocationRelativeTo(null);
JPanel p = new JPanel(new GridLayout(10, 10));
JButton b = new JButton("G");
innerCells = new JPanel[10][10];
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
innerCells[i][j] = new JPanel();
innerCells[i][j].setBorder(BorderFactory.createLineBorder(Color.orange));
p.add(innerCells[i][j]);
}
}
innerCells[0][0].add(b);
fr.add(p);
}
最佳答案
为按钮添加一个按键监听器(使用 KeyBindings 会更好)。
为当前面板的索引(例如 x,y)创建两个 int 变量。
在 keyPressed(KeyEvent e) 方法中 从当前面板中删除按钮并将其添加到新面板。
注意:按钮必须有焦点,如果你想用键移动它。
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame {
private JPanel [][] innerCells;
private JButton b = new JButton("G");
private int x=0;
private int y=0;
private final int size=10;
public MyFrame() {
JFrame fr = new JFrame("Final Exams");
fr.setSize(800, 600);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setVisible(true);
fr.setLocationRelativeTo(null);
JPanel p = new JPanel(new GridLayout(size, size));
innerCells = new JPanel[size][size];
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
innerCells[i][j] = new JPanel();
innerCells[i][j].setBorder(BorderFactory.createLineBorder(Color.orange));
p.add(innerCells[i][j]);
}
}
innerCells[0][0].add(b);
fr.add(p);
b.addKeyListener(new KListener());
}
private class KListener extends KeyAdapter{
public void keyPressed(KeyEvent e){
innerCells[x][y].remove(b);
innerCells[x][y].repaint();
int keyCode = e.getKeyCode();
switch( keyCode ) {
case KeyEvent.VK_UP:
x= x-1;
break;
case KeyEvent.VK_DOWN:
x= (x+1)%size;
break;
case KeyEvent.VK_LEFT:
y= y-1;
break;
case KeyEvent.VK_RIGHT :
y= (y+1)%size;
break;
}
if(x<0) x=size-1;
if(y<0)y=size-1;
innerCells[x][y].add(b);
innerCells[x][y].revalidate();
b.requestFocus();
}
´ }
public static void main(String[] args){
MyFrame f = new MyFrame();
}
}
关于java - 二维 JPanel [][] 表上的 KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937307/