在JFrame上使用两个JPanel时,是否未执行绘制请求?

时间:2014-03-15 19:29:41

标签: java swing layout jframe jpanel

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

这是代码,

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,然后绘制一个rectange,这个paint请求不是由JVM调用的。

帮帮我。我现在应该做什么?

1 个答案:

答案 0 :(得分:3)

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

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

在你的情况下,你不调用revalidate(),所以第二个面板的大小为o(0,0),因此没有任何东西可以绘制。

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

您需要重新设计应用程序或使用其他布局来获得所需的效果。

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