我试图在一个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 回答
默认情况下,JFrame使用BorderLayout . 向框架添加组件并且未指定约束时,组件将添加到CENTER . 只能将一个组件添加到中心,因此仅显示最后一个组件 .
但是,当您将组件添加到可见GUI时,还需要在添加组件的面板上调用
revalidate()
和repaint()
,以便可以调用布局管理器 .在您的情况下,您不调用revalidate(),因此第二个面板的大小为o(0,0),因此没有任何内容可以绘制 .
如果你调用revalidate()然后第二个面板将有一个大小,但现在第一个面板将不会被绘制 .
您需要重新设计应用程序或使用不同的布局来获得所需的效果 .
此外,在main()方法中,您应该在使框架可见之前将面板添加到框架中 .