如何将 JPanel 添加到 JFrame 对象?

问题描述

这里是编程初学者。尝试简单地创建 JFrame 对象,该对象允许我单击窗口的边界并显示我单击的坐标。但是,每当我单击新位置时,以前的坐标都需要消失。有人告诉我,一种方法是将 JPanel 添加到 JFrame 对象的中心。但是,当我这样做时,我收到一条错误消息,指出我正在向容器添加一个窗口。我可能从我阅读的内容错误地扩展了某些内容,但我似乎无法弄清楚。

public class Proj07 {
    public static void main(String[] args){
        new Proj07Runner();
      }
    }

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Proj07Runner{
    
    GUI gui = new GUI();
}

class MyFrame extends JFrame{
    int XCoor;
    int YCoor;
    
    public void paint(Graphics g){
        g.drawString("x = " + XCoor + ",y = " + YCoor,XCoor,YCoor);
    }
}

class GUI{
    public GUI(){
        MyFrame displayWindow = new MyFrame();
        displayWindow.setSize(300,100);
        displayWindow.setTitle("Insert name here");
        displayWindow.addWindowListener(new WProc1());
        
        JPanel myPanel = new JPanel();
        displayWindow.getContentPane().add(myPanel,"Center");
        displayWindow.setVisible(true);
        }
}

class MouseProc extends MouseAdapter{
    
    
    public void mousepressed(MouseEvent e){
    ((MyFrame)e.getComponent()).XCoor = e.getX();
    ((MyFrame)e.getComponent()).YCoor = e.getY();
    
    e.getComponent().repaint();
    }
}

class WProc1 extends WindowAdapter{
    public void windowClosing(WindowEvent e){
        System.exit(0);
    }
} 

谢谢大家的帮助!

解决方法

我不是 100% 确定,但我认为问题在于您将侦听器放在哪里:

您需要在 JPanel 上做所有事情,而不是作为容器的框架,因此您应该将声明替换为:

    MyFrame displayWindow = new MyFrame();
    displayWindow.setSize(300,100);
    displayWindow.setTitle("Insert name here");
    displayWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    JPanel myPanel = new JPanel();
    myPanel.setSize(300,100);
    myPanel.addMouseListener(new myMouse)
    displayWindow.getContentPane().add(myPanel,"Center");
    displayWindow.setVisible(true);

然后创建一个 mouseListener 而不是 mouseAdapter 来添加到 JPanel 中。
还要删除最后一个 WindowsAdapter 的东西,只需使用 exitonclose。

编辑:
当涉及到框架应该做什么时,它应该只包含面板,因此您还需要将您在框架上所做的一切移动到面板(例如 public void paint() 和东西)。
我想说的是,如果您想在一个框架上添加多个面板,您应该考虑将所有面板放在另一个面板中(作为一个容器),然后将该面板放在框架内。