2011-09-15 94 views
2

我有JFrame动态添加JPanel情况下,以下列方式工作。我只能看到需要手动调整窗口大小的框。JFrame的执行时间增加的JPanel

注:我尝试使用this.pack();,但这并没有奏效。

回答

3

在对GUI进行了这样的结构更改之后,您需要致电revalidate()repaint()

请注意,setSizesetLocation最好由布局管理器处理。

相关链接:

+0

我该如何使用布局管理器来处理大小和位置? – JMira

+0

这取决于您希望如何将组件放在框架中。如果您希望该框具有位置'x,y',您应该创建自定义布局管理器,将内容窗格设置为使用此管理器,并在添加面板时将x和y传递给布局管理器。例如Google for * java自定义布局管理器*。 – aioobe

1

这个例子显示add/remove/pack可能会有帮助。

private void addBox(int x, int y){ 
    JPanel panel = new JPanel(); 
    panel.setBackground(Color.RED); 
    add(panel); 
    //If there isn't another JPanel, then this way you'll occupy 
    //the whole JFrame area; by defalut, JFrame has BorderLayout, 
    //and only one JComponent can occupy the central area 
    revalidate(); 
    repaint(); 
} 
+0

你怎么知道他还没有完成getContentPane()。setLayout(null)'? – aioobe

+0

@aioobe 1)是的,只有在有setLayout(null)的情况下,2)setSize和setLocation没有,因为相当忽略了使用的LayoutManager并且在任何情况下都可以工作 – mKorbel

+0

* ...并且在所有案例* - 嗯,传递给'setSize'的值将被任何布局管理器覆盖(即只有在组件需要重新布局之前才会使用)。也许这就是你想说的;-) – aioobe

2

这些箱子的用途是什么?

如果他们是纯粹的视觉,并且不打算将组件添加到他们,这将是更好地定义一个类Box(或使用Rectangle2D),并绘制或填补他们在paintComponent()时间。

或者,将它们绘制到BufferedImageGraphics对象上,并将图像添加到JLabel,如here所示。

enter image description here

+0

不错的黑暗(用烟花)+1 – mKorbel