Java 何时validate()、invalidate()以及两者的组合是必需的? 总结
在Swing中,有可能验证和失效Java 何时validate()、invalidate()以及两者的组合是必需的? 总结,java,swing,user-interface,Java,Swing,User Interface,在Swing中,有可能验证和失效JComponents invalidate()将组件层次结构标记为无效,然后通过编程或隐式方式对其进行验证 validate()验证组件层次结构,即基本上检查布局并确保它是最新的 revalidate()同时执行这两项操作,因此构成一个显式的validate()调用 此信息与此处所述内容一致: 脚本 然而,何时确切地使用这些功能还不清楚 在我的场景中,我实现了一个JPanel扩展,其中另一个线程将触发事件,这些事件使用SwingUtilities.invo
JComponent
s
将组件层次结构标记为无效,然后通过编程或隐式方式对其进行验证invalidate()
验证组件层次结构,即基本上检查布局并确保它是最新的validate()
同时执行这两项操作,因此构成一个显式的revalidate()
调用validate()
JPanel
扩展,其中另一个线程将触发事件,这些事件使用SwingUtilities.invokeLater
将对面板的更改排队。这些更改包括对两个JLabel
s的更新
这些更新函数如下所示:
SwingUtilities.invokeLater( () ->
{
iconLabel.setIcon( myIcon ) );
textLabel.setText( "Bla" );
} );
最初我认为,更改图标可能会出现问题,因此我在函数中使用了invalidate()
或revalidate()
,以通知Swing我希望确保更新此布局并检查层次结构
然而,组件失效还有其他与UI相关的副作用,所以这些行被删除了。不过,该面板一直保持更新良好
问题:
因此,我想知道,当需要调用validate()
/invalidate()
/revalidate()
时,确切的条件是什么
在EDT上操作时是否有必要调用这些函数,我在上面的示例中显然是这样做的,因为使用了SwingUtilities.invokeLater
?什么时候允许省略这些功能
我已经检查了大量的问题,但是我找不到明确的用法规则
- 这里指出,这些方法是线程安全的,不需要在EDT上调用,即使这是指
:JavaFX
上的文档说明,调用例如JComponent
来发布更新根本不是必需的(不再是?):revalidate()
revalidate()
,这可能会影响组件的大小。由于组件的尺寸可能会改变,因此面板上组件的布局可能会受到影响。因此,revalidate()
基本上用于确保调用布局管理器
Swing组件足够智能,可以在需要时调用revalidate()
和repaint()
。注意:AWT组件没有自动调用invalidate()和validate(),因此在使用AWT时,这是一个更大的问题
也就是说,当您在Swing组件上调用任何“setter”方法时,它会为您执行revalidate()
和repaint()
这就是为什么在上面的简单示例中,您不需要调用revalidate()
需要手动调用revalidate()
的一种情况是将组件添加到可见GUI上的面板中。将所有组件添加到面板后,将调用revalidate()
以调用面板的布局管理器