2012-04-18 22 views
0

阅读了很多教程,文章和问题后,我仍然对更新GUI感到困惑。此外,在这个网站上还有很多相关的问题,仍然没有运气 - 尽管我认为我的问题很简单。如何在JFrame运行时更新JLayeredPane? java

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

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

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

有一次,我创建了整体框架,显然只是调用此方法不会显示任何改变显示的帧。

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

而这就是我卡住的地方。我想在框架显示时更新内容。

我看到了人们提到的这些方法,但由于问题的本质,我无法完全理解这些概念。再加上关于这些方法的文档并没有什么帮助 - 至少对我而言。

revalidate() 
validate() 
repaint() 

应该如何/何时应该调用这些方法?或者,鉴于这些方法和我试图解决的问题,这不是我应该做的正确方法吗?

谢谢你的时间。

+0

问题与答案http://stackoverflow.com/questions/9885855/how-to-dynamically-add-jbutton-to-jpanel/9885927#9885927可能是有用的 – Robin 2012-04-19 06:22:57

回答

2

基本上你需要两个方法:

重新验证()

此方法不一样无效(),但在AWT事件指派线程(我会叫它Swing线程稍后的))。它更新容器及其所有祖先(放置这个容器的父容器)的布局。

基本上,如果你要么移动这个容器内的东西或者放置/移除它内部的组件,你应该调用这个方法(或者在你在Swing线程中执行它时失效,例如在任何Mouse/Action listener体内或者内)。

重绘()

此方法强制组成部分,它的所有的子组件(如果有的话他们)和父容器(基本上,如果这部分是透明的)来更新他们是什么“清明上河图”。

通常你不需要这个方法,因为所有标准的Swing组件都知道什么时候重新绘制自己,并且它们自己做(当然取决于组件的UI和其他东西)。如果您使用某种独特的绘画方式(例如对组件进行某些自定义选择)以及使用标准组件的一些罕见问题,您可以使用此方法。

此方法的行为方式取决于组件的位置(由于一些Swing绘图优化) - 如果您有一些大规模的重绘滚动,您最好优化它们以仅重绘那些实际需要的部分(rects)重绘。例如,如果更改任何容器内的组件边界,最好的选择是重新绘制旧边界矩形和新边界矩形或重新绘制包含这两个边界的矩形,但不是整个容器,以避免重新绘制操作组件中未受影响的内容。

所以,基本上你的情况后,随后重新绘制一些变化与面板你应该叫他们重新验证容器(或无效)(如果重新验证留下了一些视觉假象),再次为容器。

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

0

在更新方法结束时重新验证,如下所示。

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

}