Java JPanel未显示在我的JFrame中

Java JPanel未显示在我的JFrame中,java,swing,jpanel,Java,Swing,Jpanel,所以我在玩JPanel和JFrames,我注意到我创建的JPanel在添加到Jframe对象时没有显示。注意,当我在Jframe构造函数中创建了一个JPanel,并在添加到Jframe之前给出了JPanel参数时,它起了作用。但是现在我使用我创建的JPanel对象,它不再工作了。 这就是我所做的 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graph

所以我在玩JPanel和JFrames,我注意到我创建的JPanel在添加到Jframe对象时没有显示。注意,当我在Jframe构造函数中创建了一个JPanel,并在添加到Jframe之前给出了JPanel参数时,它起了作用。但是现在我使用我创建的JPanel对象,它不再工作了。 这就是我所做的

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyGui extends JFrame {

    MyMouseListener listen = new MyMouseListener();

    public MyGui() {
        setSize(500, 500);
        //setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        getContentPane().setBackground(Color.WHITE);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        Panel panel = new Panel();
        add(panel, BorderLayout.WEST);
        //setVisible(true);
        show();
    }

    public static void main(String[] a) {
        MyGui gui = new MyGui();
    }
}

class Panel extends JPanel {

    MyMouseListener listen = new MyMouseListener();

    public Panel() {
        setPreferredSize(new Dimension(300, 300));
        addMouseListener(listen);
        setBackground(Color.YELLOW);
        setLayout(new GridLayout(3, 1));
    }

    public void paint(Graphics g) {
        super.paintComponents(g);
        g.drawOval((int) Math.round(listen.p.getX()),
                (int) Math.round(listen.p.getX()), 1, 1);
    }
}

class MyMouseListener implements MouseListener {

    Point p = new Point();

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Mouse was clicked");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        p = e.getPoint();
        System.out.println(p);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
}
编辑:
事实上,我想我已经发现了错误。JPanel有自己的绘制方法,删除该方法后,Jframe可以显示面板。但是,我需要能够在JPanel上绘制内容。

您是否尝试设置布局管理器并将面板添加到contentPane而不是JFrame本身

getContentPane().setLayout(new BorderLayout());
getContentPane().add(panel, BorderLayout.WEST);

您是否尝试设置布局管理器并将面板添加到contentPane而不是JFrame本身

getContentPane().setLayout(new BorderLayout());
getContentPane().add(panel, BorderLayout.WEST);

框架的默认布局管理器是
FlowLayout
而不是
BorderLayout
。在您的
MyGui
构造函数中尝试
setLayout(new BorderLayout())

框架的默认布局管理器是
FlowLayout
而不是
BorderLayout
。在您的
MyGui
构造函数中尝试
setLayout(new BorderLayout())

您没有为内容窗格设置布局。尝试类似于
getContentPane.setLayout(新布局())

查看oracle文档以了解布局管理器的详细信息:


希望这有帮助

您没有设置内容窗格的布局。尝试类似于
getContentPane.setLayout(新布局())

查看oracle文档以了解布局管理器的详细信息:

希望这有帮助

1)
super.paintComponents(g)
;内部
paint()
可以是

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    ....
}
2) 不要设置任何尺寸
setSize(500500)
;或
setPreferredSize(新尺寸(300300))
,使用
pack()
,然后(取消注释)
setVisible(true)
用于JFrame,并覆盖
getPreferredSize()
用于
JPanel

3)
MyGui=newmygui()内部
publicstaticvoidmain(String[]a){
,应该包装到
invokeLater
,更多信息请参见
Oracle教程初始线程
1)
super.paintComponents(g)
;内部
paint()

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    ....
}
2) 不要为JFrame设置任何大小
setSize(500500)
;或
setPreferredSize(新维度(300300));
,使用
pack()
,然后(取消注释)
setVisible(true)
,并为
JPanel覆盖
getPreferredSize()

3)
MyGui gui=new MyGui();
内部
public static void main(String[]a){
,应该包装到
invokeLater
,更多信息请参见
Oracle教程初始线程

its

super.paintComponent(g);

忠告:

1) 你让事情变得不必要的复杂。 e、 要关闭窗口,您应该使用

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

而不是调用
System.exit(0);
并使用窗口侦听器

2) 正如@mKorbel所说,您应该使用
SwingUtilities.invokeLater
启动gui,因为Java gui应该在EDT(事件调度线程)上运行,而不应该在主线程上运行。

super.paintComponent(g);

忠告:

1) 你让事情变得不必要的复杂。 e、 要关闭窗口,您应该使用

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

而不是调用
System.exit(0);
并使用窗口侦听器


2) 正如@mKorbel所说,您应该使用
SwingUtilities.invokeLater
启动gui,因为Java gui应该在EDT(事件调度线程)上运行,而不应该在主线程上运行。

在显示帧之前调用pack()或setSize()。如果在显示Call revalidate()之后添加面板,请重新绘制();我在你的代码中更改的唯一一件事就是查看你的面板,就是将
super.paintComponents(g);
更改为
super.paintComponent(g);
。这仍然保留了你没有绘制的椭圆。@JonathanDrapeau看起来像这样吗?public void paintComponent(Graphics g){super.paintComponent(g);g.drawOval((int)Math.round)(listen.p.getX()),(int)Math.round(listen.p.getX()),(int)Math.round(listen.p.getX()),(int)Math.round(listen.p.getX()),(int)Math.round(listen.p.getX()),1,1);
,除了那一行之外,没有提到任何更改。:)Call pack()或者在显示框架之前设置大小()。如果在显示后添加面板,请调用重新验证();重新绘制();我在代码中更改的唯一内容是查看面板,将
super.paintComponents(g);
更改为
super.paintComponent(g)
。这仍然会遗漏未绘制的椭圆。@JonathanDrapeau看起来是这样的吗?public void paintComponent(Graphics g){super.paintComponent(g);g.drawOval((int)Math.round(listen.p.getX()),(int)Math.round(listen.p.getX()),1);}@JonathanDrapeau,因为我的不工作。
public void paints(Graphics g){super.paintComponent(g);g.drawOval((int)Math.round(listen.p.getX()),(int)Math.round(listen.p.getX()),1,1);}
,除了那一行之外,没有提到其他任何更改。:)有一个首选大小设置为
JPanel
,制作
pack()
setVisible
工作正常。@Jonathan Drapeau@mKorbel您是在谈论JPanel中的绘画组件吗?因为我已经包括了对super的调用并对其进行了注释,但在这两种情况下JPanel仍然没有出现。@Michael Nana在上面写给Jonathan Drapauth的注释中看到了我的链接代码将首选大小设置为
JPanel
,使
pack()
setVisible
正常工作。@Jonathan Drapeau