阅读了很多教程,文章和问题后,我仍然对更新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()
应该如何/何时应该调用这些方法?或者这不是我应该做的正确方法,考虑到这些方法和我想解决的问题?
感谢您的时间。
答案 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
}