在 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的问题,但是我找不到明确的使用规则。
JavaFX
:https://docs.oracle.com/javase/tutorial/uiswing/布局/howLayoutWorks.htmlJComponent
的文档指出,根本不需要(不再?)调用 e.g. revalidate()
来发布更新:https://docs.oracle.com/javase/7/docs/api/javax /swing/JComponent.html我对此的简单看法是,当 Swing 组件的属性发生更改(可能会影响组件的大小)时,将使用
revalidate()
。由于元件的尺寸可能会改变,因此面板上元件的布局可能会受到影响。因此 revalidate()
基本上用于确保调用布局管理器。
Swing 组件足够智能,可以在需要时调用
revalidate()
和 repaint()
。注意 AWT 组件不会自动调用 invalidate() 和 validate(),因此在使用 AWT 时这会成为一个问题。
也就是说,当您在 Swing 组件上调用任何“setter”方法时,它会为您执行
revalidate()
和 repaint()
。
这就是为什么在上面的简单示例中您不需要调用
revalidate()
。
需要手动调用
revalidate()
的一种情况是将组件添加到可见 GUI 上的面板时。将所有组件添加到面板后,您将调用 revalidate()
来调用面板的布局管理器。
只有在Java中才有带有“invalidate”一词的单词或某些方法。在英语中,validate 和 invalidate 的含义完全相反。然而,Java 让它变得如此令人困惑,因为我猜这就是他们所说的模糊逻辑,当验证不足以使用一个名为“validate”的单词返回一个布尔值(true 或 false)时? true 有效, false 无效。就这么简单,反之亦然,具体取决于验证规则是什么。你到底为什么要拐弯抹角地美化代码,以免其他人对术语感到困惑呢?因此,“验证”可以替换“无效”和“重新验证”,并根据需要使用依赖项注入来实现任何必要的重新验证逻辑。无需创建或复制更多代码。