如何在JFrame运行时更新JLayeredPane? java的

时间:2012-04-18 23:44:19

标签: swing jframe jpanel

阅读了很多教程,文章和问题后,我仍然对更新GUI感到困惑。此外,这个网站上有很多相关的问题,但仍然没有运气 - 尽管我认为我的问题非常简单。

基本上,我有一个JFrame,它有一个JLayeredPane作为它的根容器。我内部有一些JPanel层。

主要问题是更新此JLayeredPane中的特定JPanel。对于这个特定的Panel,我实现了一个更改其内部内容的更新方法。

updatePanel(int para)
//doesn't remove this panel
//removes some existing labels and replaces it with new ones

一旦我创建了整个Frame,显然只是调用此方法不会显示任何更改显示帧。

private void static main (String[] args){
    WindowFrame frame = new WindowFrame()//WindowFrame extends JFrame
    frame.updatePanel(2);
    .....
    .....
}

这就是我被困的地方。我希望在显示框架时更新内容。

我看到人们提到的这些方法,但由于问题的性质,我无法完全掌握这些概念。此外,关于这些方法的文档并没有真正帮助 - 至少对我而言。

revalidate()
validate()
repaint()

应该如何/何时应该调用这些方法?或者这不是我应该做的正确方法,考虑到这些方法和我想解决的问题?

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

基本上你需要两种方法:

<强>重新验证()

此方法与invalidate()的作用相同,但在AWT事件调度线程中(稍后我将稍后将其称为Swing线程))。它更新容器及其所有祖先(放置此放置的父容器)布局。

基本上,如果你要么在这个容器内移动一些东西,要么在其中放置/删除组件,你应该调用这个方法(或者在你在Swing线程中执行它时无效,例如在任何鼠标/动作监听器体内或者在里面)。

<强>重绘()

此方法强制组件,其所有子组件(如果有它们)和父容器(基本上如果此组件不是不透明的)来更新它们“绘画”的内容。

通常你不需要这种方法,因为所有标准的Swing组件都知道何时重新绘制它们并且它们自己完成(当然这取决于组件UI和其他一些东西)。如果您拥有自己的特定组件,并且具有一些独特的绘画方式(例如,对组件进行一些自定义选择),并且在一些罕见的标准组件问题情况下,此方法可能很有用。

此方法的作用方式取决于组件的放置(由于一些Swing绘画优化) - 如果你有一些大规模的重绘,你最好优化它们只重绘你真正需要重绘的那些部分(rects) 。例如,如果更改任何容器内的组件边界,最好的选择是重新绘制其旧边界rect和新边界rect或重新绘制包含这两个边界的rect,而不是整个容器以避免重新绘制未包含在操作组件中。

所以,基本上在您的情况下,在对面板进行一些更改后,您应该在其容器上调用revalidate(或使其无效),然后再次为容器重新绘制(如果revalidate留下一些视觉文物)。

猜猜我没有错过任何东西,我希望现在你知道这些方法的基本含义。

答案 1 :(得分:0)

在更新方法结束时重新验证,如此。

updatePanel(int para){
 .....
 .....
 this.revalidate();  //of course this refer to the panel
 parent.revalidate(); // parent refer to the window

 }