在一个JFrame上使用两个jpanel时不执行绘制请求



我正在尝试在单个Jframe上使用两个JPanel。我正在使用容器将它们添加到框架中。所以当我添加第一个Jpanel到框架时,Paint Component方法被调用,但是当我添加第二个Jpanel到框架时,Paint Component方法不会被JVM调用。

这里是代码,

public class Frame {
     public Frame() {
        // TODO Auto-generated constructor stub
      }
    public static void main(String[] args)  {
         JFrame gui = new JFrame();
         gui.setTitle("Chain Reaction ;-) ");
         gui.setSize(650,650);
         gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         gui.setLocationRelativeTo(null);
         gui.setVisible(true);  
         Container Pane = gui.getContentPane();
         Panel1 myPane1 = new Panel1(Pane); 
    }
 }

这里我添加Panel1(JPanel)对象到JFrame的构造函数。我将容器引用传递给构造函数。

public class Panel1 extends JPanel {
    Container myPane;
    public Panel1(Container myPane) {
        this.myPane = myPane;
        myPane.add(this);
        addMouseListener(new event(myPane));
    }
    @Override
    public void paintComponent(Graphics g) {
        g.drawRect(200, 200, 400, 400);
    }
    public class event extends MouseAdapter {
        Container myPane;
        public event(Container myPane) {
            this.myPane = myPane;
        }
        @Override
        public void mouseClicked(MouseEvent e) {
            Panel2 myPanel2 = new Panel2(myPane);
        }
    }
}

(Panel1类有监听鼠标点击的事件类,当鼠标被点击时,它创建Panel2的对象)

public class Panel2 extends JPanel {
    Container myPane;
    public Panel2(Container myPane) {
        this.myPane = myPane;
        myPane.add(this);
    }
    @Override
    public void paintComponent(Graphics g) {
        g.drawRect(400, 400, 200, 200);
    }
}

Panel2通过构造函数接收引用Container,然后绘制一个矩形,这个绘制请求没有被JVM调用。

帮帮我。我现在该怎么办呢?

默认情况下,JFrame使用BorderLayout。当你将一个组件添加到框架并且没有指定约束时,该组件将被添加到CENTER。中心只能添加一个组件,因此只显示最后一个组件。

但是,当您向可见GUI添加组件时,您还需要调用添加组件的面板上的revalidate()repaint(),以便可以调用布局管理器。

在你的例子中,你没有调用revalidate(),所以第二个面板的大小为0(0,0),所以没有什么要绘制的

如果你调用了revalidate(),那么第二个面板将有一个大小,但是现在第一个面板将不会被绘制。

你需要重新设计你的应用程序或使用不同的布局来获得你想要的效果。

另外,在main()方法中,您应该在使框架可见之前将面板添加到框架中。

最新更新