Java 二维JPanel[]表上的KeyListener
我已经创建了一个二维JPanel表,我的第一个单元格上有一个JButton。我想用我的箭头键在表的边界内移动按钮。我必须在每个单元格或按钮上放置KeyListener?也许你会发现我的问题很愚蠢,但我需要对KeyListener的一些帮助。谢谢 这是我写的代码Java 二维JPanel[]表上的KeyListener,java,swing,jpanel,keylistener,Java,Swing,Jpanel,Keylistener,我已经创建了一个二维JPanel表,我的第一个单元格上有一个JButton。我想用我的箭头键在表的边界内移动按钮。我必须在每个单元格或按钮上放置KeyListener?也许你会发现我的问题很愚蠢,但我需要对KeyListener的一些帮助。谢谢 这是我写的代码 public class MyFrame extends JFrame { JPanel [][] innerCells; public MyFrame() { JFrame fr = new JFrame("Final Ex
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);
}
公共类MyFrame扩展了JFrame{
JPanel[][]内部细胞;
公共MyFrame(){
JFrame fr=新JFrame(“期末考试”);
fr.setSize(800600);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setVisible(真);
fr.setLocationRelativeTo(空);
JPanel p=新的JPanel(新的网格布局(10,10));
JButton b=新JButton(“G”);
innerCells=新JPanel[10][10];
对于(inti=0;i向按钮添加一个keylistener(使用KeyBinding会更好)
为当前面板的索引创建两个int变量(例如x,y)
在按下键(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.awt.Color;
导入java.awt.GridLayout;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类MyFrame扩展了JFrame{
私有JPanel[][]内部单元;
私有JButton b=新JButton(“G”);
私有整数x=0;
私有整数y=0;
私有最终整数大小=10;
公共MyFrame(){
JFrame fr=新JFrame(“期末考试”);
fr.setSize(800600);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setVisible(真);
fr.setLocationRelativeTo(空);
JPanel p=新的JPanel(新的网格布局(大小、大小));
innerCells=新的JPanel[size][size];
对于(int i=0;i的家伙,我终于解决了这个问题!以下是解决方案..我已经用KeyListener完成了,但我认为正如@MadProgrammer所说,用键绑定更容易
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Askhsh6 {
int gr, st;
Dimension dim;
public Askhsh6() {
final JFrame fr1 = new JFrame("a Title");
fr1.setSize(800, 600);
fr1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr1.setVisible(true);
fr1.setResizable(false);
final JButton b = new JButton("G");
dim = new Dimension(70, 50);
b.setSize(dim);
b.setFocusable(false);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b.validate();
b.repaint();
boolean pop = b.isFocusOwner();
pop = b.isFocusOwner();
System.out.println("" + pop);
}
});
final JPanel[][] p;
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(8, 6));
p = new JPanel[8][6];
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 6; j++) {
p[i][j] = new JPanel();
p[i][j].setLayout(new BorderLayout());
p[i][j].setBorder(BorderFactory.createLineBorder(Color.orange));
p1.add(p[i][j]);
}
}
p[0][0].add(b, BorderLayout.CENTER);
gr = st = 0;
fr1.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent ke) {
if (ke.getKeyCode() == KeyEvent.VK_DOWN) {
System.out.println("DOWN");
if (gr + 1 < 8) {
p[gr][st].remove(b);
gr = gr + 1;
p[gr][st].add(b, BorderLayout.CENTER);
fr1.repaint();
}
}
if (ke.getKeyCode() == KeyEvent.VK_UP) {
System.out.println("UP");
if (gr - 1 >= 0) {
p[gr][st].remove(b);
gr = gr - 1;
p[gr][st].add(b, BorderLayout.CENTER);
fr1.repaint();
}
}
if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("LEFT");
if (st - 1 >= 0) {
p[gr][st].remove(b);
st = st - 1;
p[gr][st].add(b, BorderLayout.CENTER);
fr1.repaint();
}
}
if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("RIGHT");
if (st + 1 < 6) {
p[gr][st].remove(b);
st = st + 1;
p[gr][st].add(b, BorderLayout.CENTER);
fr1.repaint();
}
}
}
});
fr1.add(p1);
fr1.validate();
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类Askhsh6{
int gr,st;
尺寸标注;
公共Askhsh6(){
最终JFrame fr1=新JFrame(“标题”);
fr1.设置尺寸(800600);
fr1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr1.设置可见(真);
fr1.可设置大小(假);
最终按钮b=新按钮(“G”);
尺寸=新尺寸(70,50);
b、 设置大小(dim);
b、 设置聚焦(假);
b、 addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
b、 验证();
b、 重新油漆();
布尔pop=b.isFocusOwner();
pop=b.isFocusOwner();
System.out.println(“+pop”);
}
});
最终JPanel[][]p;
JPanel p1=新的JPanel();
p1.设置布局(新网格布局(8,6));
p=新JPanel[8][6];
对于(int i=0;i<8;i++){
对于(int j=0;j<6;j++){
p[i][j]=新的JPanel();
p[i][j].setLayout(newborderlayout());
p[i][j].setboorder(BorderFactory.createLineBorder(Color.orange));
p1.添加(p[i][j]);
}
}
p[0][0]。添加(b,BorderLayout.CENTER);
gr=st=0;
fr1.addKeyListener(新的KeyAdapter(){
@凌驾
按下公共无效键(KeyEvent ke){
if(ke.getKeyCode()==KeyEvent.VK_DOWN){
System.out.println(“向下”);
如果(gr+1<8){
p[gr][st]。移除(b);
gr=gr+1;
p[gr][st].添加(b,BorderLayout.CENTER);
fr1.重新绘制();
}
}
if(ke.getKeyCode()==KeyEvent.VK_UP){
System.out.println(“UP”);
如果(gr-1>=0){
p[gr][st]。移除(b);
gr=gr-1;
p[gr][st].添加(b,BorderLayout.CENTER);
fr1.重新绘制();
}
}
if(ke.getKeyCode()==KeyEvent.VK_左){
系统输出打印项次(“左”);
如果(st-1>=0){
p[gr][st]。移除(b);
st=st-1;
p[gr][st].添加(b,BorderLayout.CENTER);
fr1.重新绘制();
}
}
if(ke.getKeyCode()==KeyEvent.VK_RIGHT){
System.out.println(“右”);
如果(st+1<6){
p[gr][st]。移除(b);
st=st+1;
p[gr][st].添加(b,BorderLayout.CENTER);
fr1.重新绘制();
}
}
}
});
fr1.添加(p1);
fr1.validate();
}
}
看一看,基本上,忽略KeyListener并使用它,非常感谢!我会处理它,我会发布我的答案!;)那么你的意思是没有监听器?为什么键绑定更好?请删除此答案,1)您是否尝试过@MadProgrammer注释中的链接代码,2)默认情况下JFrame bever对来自KeyListener的KeyEvents作出反应,必须从AWTEventListener重新路由3)永远不要将KeyListener用于简单的KeyEvents,simpleKeysShortCuts@ManolisKaragiannis请忽略此答案,添加带有图标的JLabels(而不是在JPanel之间使用真正的JButton移动),为MouseEvents添加MouseListener,为setIcon(iconlookslikeeasbtton)和setIcon(null)@Manolis-Karagiannis之间的切换添加KeyBindins,如果没有doLayout()¬ify(),这段代码将永远无法正常工作,使用revalidate()和repaint()@Manolis-Karagiannis()肯定会更好