isDisplayable(),isShowing(),isVisible()为JDialog提供了错误的值

时间:2018-08-15 06:49:57

标签: java swing jdialog look-and-feel

环境:

操作系统:Win 10

IDE:Netbeans 8.1

Java:JDK 1.8u112 Oracle

jre:10.0.2

JTattoo laf:来自http://www.jtattoo.net/的HiFiLookAndFeel

上下文:

创建外观(“ laf”)切换类。

描述:

有一个类A(“ A”)扩展了JFrame(“ frame”)。它具有一些GUI组件,例如JFileChooser(“ fc”),按钮等。其main(“ main”)方法包括(通过dummy_method(List<String> myList) { if(myList.isEmpty()) { return null; } String firstListValue = myList.get(0).getStringValue(); // Should I do this: if ("YES".equalsIgnoreCase(firstListValue)) { return firstListValue; } // OR this: if (firstListValue.equalsIgnoreCase("YES")) { return firstListValue; } // Do something else } (“ swingU”)在EDT内部)设置A的实例,设置可见然后调用doClick单击调用Swingutilities.invokeLater()的按钮(放置在框架中)。此时,屏幕上会显示一个框架和fc。

回到主要。 swingU返回main。延迟约3秒(请参见代码),然后导致更改laf。

laf更改是由另一个称为changer的类引起的。它有一个名为change的方法,即

  1. 通过fc.showOpenDilaog(this)获取所有打开的窗口
  2. 通过检查它们的类是否具有JFrame或JDialog作为超类,将它们分类为Jframe,JDialogs(“ dialog”)并保留到Windows中。
  3. 对于每个对话框,记录其可见性,设置标题栏,进行处理,更新其UI,然后按照其原始可见性恢复它(请参见代码)(无关,但代码对框架也相同)

上述步骤本身是通过swingU在EDT上执行的。

问题:

  1. 随着laf的变化,fc消失了,而A在新laf中仍然可见。

预期:

  1. fc和A都应保持可见,并显示新的laf。

问题的进展:

  1. 使用Window.getWindows()(“ sop”)(内部更改方法)来显示 对话框的isDisplayable(),isShowing(),isVisible()。所有这些 尽管fc清晰可见,但仍返回错误。查找其来源(“ src”)后,使用了 dialog.getParent()(此返回A)并浸泡其 isDisplayable(),isShowing(),isVisible()。这些返回true。没道理!

  2. fc.showOpenDilaog(null)使问题消失。

  3. 甚至试图通过sun.awt.AppContext进行浏览-无法产生正面或反面。

捕获:

  1. changer类无法访问A的成员,例如fc在A中是私有的,按钮也是如此...对于所有意图,目的更改者都不知道框架的身份/无法对其进行分析。
  2. 关于lafs(从WindowsLookAndFeel到HiFiLookAndFeel)的给定配置,唯一的特别之处在于,后者对于System.out.println返回true。

根据安德鲁(SSCE)的建议,SSCE

getSupportsWindowDecorations()

0 个答案:

没有答案