Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时validate()、invalidate()以及两者的组合是必需的? 总结_Java_Swing_User Interface - Fatal编程技术网

Java 何时validate()、invalidate()以及两者的组合是必需的? 总结

Java 何时validate()、invalidate()以及两者的组合是必需的? 总结,java,swing,user-interface,Java,Swing,User Interface,在Swing中,有可能验证和失效JComponents invalidate()将组件层次结构标记为无效,然后通过编程或隐式方式对其进行验证 validate()验证组件层次结构,即基本上检查布局并确保它是最新的 revalidate()同时执行这两项操作,因此构成一个显式的validate()调用 此信息与此处所述内容一致: 脚本 然而,何时确切地使用这些功能还不清楚 在我的场景中,我实现了一个JPanel扩展,其中另一个线程将触发事件,这些事件使用SwingUtilities.invo

在Swing中,有可能验证和失效
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()
    来发布更新根本不是必需的(不再是?):

我看待这一点的简单方法是,当Swing组件的属性发生更改时,使用
revalidate()
,这可能会影响组件的大小。由于组件的尺寸可能会改变,因此面板上组件的布局可能会受到影响。因此,
revalidate()
基本上用于确保调用布局管理器

Swing组件足够智能,可以在需要时调用
revalidate()
repaint()
。注意:AWT组件没有自动调用invalidate()和validate(),因此在使用AWT时,这是一个更大的问题

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

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

需要手动调用
revalidate()
的一种情况是将组件添加到可见GUI上的面板中。将所有组件添加到面板后,将调用
revalidate()
以调用面板的布局管理器