Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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:JFrame与MouseListener、KeyListener和PaintComponent的问题_Java_Jframe_Keylistener_Paintcomponent_Mouselistener - Fatal编程技术网

Java:JFrame与MouseListener、KeyListener和PaintComponent的问题

Java:JFrame与MouseListener、KeyListener和PaintComponent的问题,java,jframe,keylistener,paintcomponent,mouselistener,Java,Jframe,Keylistener,Paintcomponent,Mouselistener,我有一个问题,我的鼠标听筒没有反应。我尝试将鼠标侦听器添加到一个对象中,将keyListener添加到另一个对象中,将paintComponent添加到另一个对象中,然后将所有对象放到JFrame上。我的问题是mouseListener没有响应,但是keyListener和paintComponent有响应。这是我的密码: public JFrame frame = new JFrame("JFrame Test"); public static void main(String[]args)

我有一个问题,我的鼠标听筒没有反应。我尝试将鼠标侦听器添加到一个对象中,将keyListener添加到另一个对象中,将paintComponent添加到另一个对象中,然后将所有对象放到JFrame上。我的问题是mouseListener没有响应,但是keyListener和paintComponent有响应。这是我的密码:

public JFrame frame = new JFrame("JFrame Test");

public static void main(String[]args) {
    new JFrameTest();
}

public JFrameTest() {
    frame.setSize(100, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.add(new keys());
    frame.add(new mouse());
    frame.add(new render());
    frame.setVisible(true);
}

@SuppressWarnings("serial")
public class render extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillRect(0, 0, frame.getWidth() / 2, frame.getHeight() / 2);
        repaint();
    }
}

@SuppressWarnings("serial")
public class keys extends JPanel {
    public keys() {
        setFocusable(true);
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("Key Pressed!");
            }

            public void keyReleased(KeyEvent e) {
                System.out.println("Key Released!");
            }
        });
    }
}

@SuppressWarnings("serial")
public class mouse extends JPanel {
    public mouse() {
        setFocusable(true);
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                System.out.println("Mouse Pressed!");
            }

            public void mouseReleased(MouseEvent e) {
                System.out.println("Mouse Released!");
            }
        });
    }
}

我确保mouseListener和keyListener都是可设置焦点的(true),并且paintComponent是最后添加的,因此它实际上可以显示。看起来好像我切换了添加keyListener对象和mouseListener对象的顺序,两者都不起作用。如果您对如何修复它有任何想法,我将不胜感激。谢谢

我将告诉您问题所在,JFrame使用BroderLayout作为其默认布局管理器。因此,当您在一行中执行frame.add()三次而不指定添加JPanel的位置时,您在一行中对同一面板进行了三次重写

因此,你最后添加的内容将在那里

试试这个

frame.add(new keys(), BorderLayout.NORTH);
frame.add(new mouse(), BorderLayout.SOUTH);
frame.add(new render(), BorderLayout.CENTER);

作为旁注,这看起来是一种非常奇怪的编程方式。最好创建一个扩展JPanel的类,并在其中添加一个键侦听器和鼠标侦听器。并重写它的paintComponent()方法来进行渲染。

多谢了,这有些效果。完成此操作后,mouseListener仅在JFrame的南部工作,渲染居中。有没有方法能正确地把这些图层分层,并使它们都能工作?@ MRDPROF:考虑阅读java教程,特别是关于布局组件的一些。是的,我刚才在回答中提到过。查看您正在执行的操作是在一个面板中侦听按键,并在另一个面板中侦听鼠标单击。您正在尝试将面板添加到一个一次只能在一个位置容纳一个面板的框架中。我要再说一遍,创建一个扩展JPanel的类。使其实现MouseListener和KeyListener,并实现接口的方法。创建一个重写paintComponent的方法,使其执行渲染。完成后,将您的类添加到jframe。好的,我接受了您的建议,我想我会同意。谢谢你的帮助