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