【问题标题】:How to add a JPanel to a JFrame object?如何将 JPanel 添加到 JFrame 对象?
【发布时间】:2024-01-05 04:06:01
【问题描述】:

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

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);
    }
} 

谢谢大家的帮助!

【问题讨论】:

    标签: java swing user-interface jframe jpanel


    【解决方案1】:

    我不是 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() 和其他东西) .
    我想说的是,如果您想在一个框架上添加多个面板,您应该考虑将所有面板放入另一个面板(作为容器),然后将该面板放入框架内。

    【讨论】:

    • 我已经进行了调整,但仍然收到无法将窗口添加到容器的错误消息。我显然在这里遗漏了一些基本的东西,但我不确定是什么。
    • 我让它工作了!我删除了所有以前的类文件,并将其设置为文件夹中的唯一文件,由于某种原因,这导致它可以编译和工作。我现在唯一的问题是当我单击时坐标出现,但当我再次单击时坐标不会消失。不知道如何让它工作,因为我只被告知添加面板可以让它工作。
    • 每次您想要更改图形时都需要为面板调用repaint();,否则之前的所有内容都不会消失,因为您只是在上面绘画。我会说问题在于你如何调用重绘。例如,您不应该在框架上绘画(只是一个示例,因为我看不到您的代码)。
    • 所以(如果您的代码仍然与您最初发送的相似)它不是displayWindow.repaint();,而是myPanel.repaint(); .框架应该只是包含面板,所以public void paint(Graphics g) 的东西也需要放在那里
    • @Alex Brown 如果我的回答帮助您解决了第一个问题,请将其标记为正确:)