首页 文章

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

提问于
浏览
0

我试图在一个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 回答

  • 3

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

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

    在您的情况下,您不调用revalidate(),因此第二个面板的大小为o(0,0),因此没有任何内容可以绘制 .

    如果你调用revalidate()然后第二个面板将有一个大小,但现在第一个面板将不会被绘制 .

    您需要重新设计应用程序或使用不同的布局来获得所需的效果 .

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

相关问题