java - 二维 JPanel [][] 表上的 KeyListener

标签 java swing jpanel keylistener

我创建了一个二维 JPanel 表,我的第一个单元格上有一个 JButton。我想用我的箭头键将按钮移动到我的表的边界内。我必须将 KeyListener 放在每个单元格或我的按钮上?也许你会觉得我的问题很愚蠢,但我需要一些关于 KeyListener 的帮助。谢谢! Here its what i have to create

这是我写的代码!

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/

相关文章:

java - 异步任务 : Can't update UI from publishProgress. 错误 : Only the original thread that created a view hierarchy can touch its views.

java - 如何创建一个实现 java.util.collections 的类

java - 控制拖放时的 JTree 扩展延迟

java - 从内部类调用paint方法

java - 如何在 JScrollPane 中显示 JPanel?

java - 将 Socket 从 JSP 文件发送到 Java 应用程序?

java - 为什么菱形运算符不能在 Java 7 的 addAll() 调用中工作?

java - 如何在jframe中找到滑动方向

java - 我的 java 程序一直卡住

java - 如何设置JPanel大小?