Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二维JPanel[]表上的KeyListener_Java_Swing_Jpanel_Keylistener - Fatal编程技术网

Java 二维JPanel[]表上的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

我已经创建了一个二维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);

}
公共类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()肯定会更好