0

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

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

主要问题是更新此 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()

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

感谢您的时间。

4

2 回答 2

2

基本上你需要两种方法:

重新验证()

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

基本上,如果您在此容器内移动某些东西或在其中放置/删除组件,您应该调用此方法(或者如果您在 Swing 线程中执行它,例如在任何 Mouse/Action 侦听器主体内或只是在内部,则使其无效)。

重绘()

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

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

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

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

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

于 2012-04-19T00:04:52.470 回答
0

像这样在更新方法结束时重新验证。

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

 }
于 2012-04-18T23:55:12.243 回答