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



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

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

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

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()

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

谢谢你的时间。

基本上你需要两种方法:

重新验证()

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

基本上,如果您在此容器内移动某些内容或在其中放置/删除组件,则应调用此方法(或者在 Swing 线程中执行它时无效,例如在任何鼠标/操作侦听器主体内或仅在内部)。

重绘()

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

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

此外,此方法的工作方式取决于组件的位置(由于一些 Swing 绘画优化) - 如果您有一些大规模的重绘滚动,您最好优化它们以仅重新绘制您实际需要重新绘制的那些零件(矩形)。例如,如果更改任何容器内的组件边界,则最佳选择是重新绘制其旧边界矩形和新边界矩形,或者重新绘制包含这两个边界的矩形,而不是整个容器,以避免重新绘制不涉及动作组件的矩形。

因此,基本上在您的情况下,在使用面板进行一些更改后,您应该在其容器上调用重新验证(或失效),然后再次为容器重新绘制(以防重新验证留下一些视觉伪影)。

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

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

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

最新更新