如何在构造函数中设置 GUI 不可见?

Posted

技术标签:

【中文标题】如何在构造函数中设置 GUI 不可见?【英文标题】:How to set a GUI non-visible within the constructor? 【发布时间】:2016-09-04 02:58:51 【问题描述】:

我有一个swing GUI 类Foo,在Foo 类的构造函数中,我从数据库中加载了一些值。根据从数据库返回的值,我可以说这个 GUI 是否应该可见。但是,当我在这个 GUI 类的构造函数中说this.setVisible(false); 时,它没有任何作用,因为对象创建没有完成。

如何在用户没有意识到转换(GUI 消失)的情况下完成此任务?

【问题讨论】:

在构造函数中加载数据库是个坏主意。调用此setVisible(false) 后,组件在窗口中不可见。 setVisible(false) 应该在开始读取数据库之前执行。因此,除非另有证明,否则它是不可见的(基于数据库响应的条件) “改变它的结构并不容易。” - 如果你做这种事情,下一个(可怜的)家伙会更难! 我会让构造函数接受ResultSet。在这种情况下,其他代码已经决定是否构建框架。 我想说的是,你应该努力改进代码的结构/质量,即使这意味着你需要做更多的工作。如果产品溺水/淹死......然后重新开始。 (但我怀疑您有些夸大其词。)无论哪种方式,请在 Google 中查找“技术债务”一词。 【参考方案1】:

尝试invokeLater,它只是在其run方法中延迟代码块的执行。

SwingUtilities.invokeLater(new Runnable() 
    
      public void run()
      
        yourFrame.setVisible(false);
      
    );

【讨论】:

我用“ScheduledExecutorService”尝试了类似的方法。我认为他们的工作方式相似。但是,有时用户会看到 GUI 消失,这并不好。 为什么你必须首先隐藏它? AFAIK 仅在您将其设置为可见时才显示。也许OP在他的构造函数中有一些错误......:S Nvm,确实看到了 Panel 的评论,这使得 JFrame.setVisible 过时了,因此我猜是你的答案。【参考方案2】:

我解决了我的问题。我设置了一个计时器,它每 500 毫秒检查一次它是否仍在构造函数中。我在构造函数的末尾放了一个标志。在构造函数中完成所有操作后,计时器检测到它并将 Gui 设置为不可见,并且计时器工作 15 秒,这对于创建对象并自行停止已经绰绰有余。

【讨论】:

很抱歉在这里打断您自己的解决方案。我认为 Timer 有点超出范围:S 你为什么不瞄准更多与 Listener 相关的东西?就像将面板添加到视图中一样,何时已完全构建? :S 还是广播事件而不是计时器? @m4mbax 监听器的问题是用户看到了转换。我的意思是,一开始有一个面板,但不到一秒钟,面板就消失了。然而,这看起来并不好。我知道我的解决方案并不优雅,但它解决了我的问题。

以上是关于如何在构造函数中设置 GUI 不可见?的主要内容,如果未能解决你的问题,请参考以下文章

PHP ORM如何在构造函数中设置id

在构造函数中设置默认参数?语法[关闭]

Python属性在构造函数中设置值时不使用setter

在构造函数调用中设置一个短值[重复]

Grails:在地图构造函数中设置瞬态字段

在“原型”中设置“构造函数”属性的好处