Swing 如何在JFrame运行时更新JLayeredPane?JAVA

Swing 如何在JFrame运行时更新JLayeredPane?JAVA,swing,jframe,jpanel,Swing,Jframe,Jpanel,在阅读了许多教程、文章和问题之后,我仍然对更新GUI感到困惑。此外,在这个网站上有很多相关的问题,但仍然没有运气——尽管我认为我的问题很简单 基本上,我有一个JFrame,它的根容器是JLayeredPane。我在里面有几层JPanel updatePanel(int para) //doesn't remove this panel //removes some existing labels and replaces it with new ones 主要问题是更新此JLayeredPan

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

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

updatePanel(int para)
//doesn't remove this panel
//removes some existing labels and replaces it with new ones
主要问题是更新此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()
应该如何/何时调用这些方法?或者,考虑到这些方法和我试图解决的问题,这不是我应该做的正确方式吗


谢谢您的时间。

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

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

 }

基本上,您需要两种方法:

重新验证()

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

基本上,如果您在该容器内移动某个对象,或者在其中放置/移除组件,那么您应该调用该方法(或者在Swing线程中执行该方法时使其无效,例如在任何鼠标/动作侦听器主体内或仅在其内)

重新绘制()

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

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

此外,此方法的作用方式取决于组件的放置(由于一些Swing绘制优化)-如果您有一些大规模的重新绘制,则最好对其进行优化,以便仅重新绘制实际需要重新绘制的部分(矩形)。例如,如果更改任何容器内的组件边界,最好的选择是重新绘制其旧边界rect和新边界rect,或者重新绘制包含这两个边界的rect,而不是整个容器,以避免重新绘制动作组件中未涉及的内容

因此,基本上,在对面板进行一些更改之后,您应该在其容器上调用revalidate(或invalidate),然后再次为容器重新绘制(以防revalidate留下一些可视的人工制品)

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

问答可能有用