什么时候 validate()、invalidate() 以及两者的组合是强制的?

问题描述 投票:0回答:2

总结

在 Swing 中可以验证和无效

JComponent
s。

  • invalidate()
    将组件层次结构标记为无效,然后以编程方式或隐式方式对其进行验证
  • validate()
    验证组件层次结构,i.e. 基本上检查布局并确保其是最新的
  • revalidate()
    两者兼而有之,因此构成显式
    validate()
    调用

此信息与此处所述内容一致:

Swing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别

场景

然而,尚不清楚何时使用这些功能。

在我的场景中,我实现了一个

JPanel
扩展,其中另一个线程将触发事件,并且这些事件使用
SwingUtilities.invokeLater
对面板的更改进行排队。这些更改由两个
JLabel
的更新组成。

这些更新函数看起来像这样:

SwingUtilities.invokeLater( () ->
{
    iconLabel.setIcon( myIcon ) );
    textLabel.setText( "Bla" ); 
} );

最初我认为更改图标可能会出现问题,因此我在函数中使用了

invalidate()
revalidate()
,以通知 Swing,我想确保更新此布局并检查层次结构.

但是组件失效会产生其他与 UI 相关的副作用,因此这些行被删除。然而,该面板一直在正常更新。

问题

因此,我想知道,什么时候需要调用

validate()
/
invalidate()
/
revalidate()
的确切条件是什么?

在 EDT 上操作时是否有必要调用这些函数,因为使用了

SwingUtilities.invokeLater
,所以我在上面的示例中显然是这样做的?什么时候可以省略这些功能?

我已经检查了很多关于SO的问题,但是我找不到明确的使用规则。

java swing user-interface
2个回答
1
投票

我对此的简单看法是,当 Swing 组件的属性发生更改(可能会影响组件的大小)时,将使用

revalidate()
。由于元件的尺寸可能会改变,因此面板上元件的布局可能会受到影响。因此
revalidate()
基本上用于确保调用布局管理器。

Swing 组件足够智能,可以在需要时调用

revalidate()
repaint()
。注意 AWT 组件不会自动调用 invalidate() 和 validate(),因此在使用 AWT 时这会成为一个问题。

也就是说,当您在 Swing 组件上调用任何“setter”方法时,它会为您执行

revalidate()
repaint()

这就是为什么在上面的简单示例中您不需要调用

revalidate()

需要手动调用

revalidate()
的一种情况是将组件添加到可见 GUI 上的面板时。将所有组件添加到面板后,您将调用
revalidate()
来调用面板的布局管理器。


0
投票

只有在Java中才有带有“invalidate”一词的单词或某些方法。在英语中,validate 和 invalidate 的含义完全相反。然而,Java 让它变得如此令人困惑,因为我猜这就是他们所说的模糊逻辑,当验证不足以使用一个名为“validate”的单词返回一个布尔值(true 或 false)时? true 有效, false 无效。就这么简单,反之亦然,具体取决于验证规则是什么。你到底为什么要拐弯抹角地美化代码,以免其他人对术语感到困惑呢?因此,“验证”可以替换“无效”和“重新验证”,并根据需要使用依赖项注入来实现任何必要的重新验证逻辑。无需创建或复制更多代码。

© www.soinside.com 2019 - 2024. All rights reserved.