簡體   English   中英

具有自己的L&F的Java Swing有時會突然切換回默認L&F

[英]Java Swing with own L&F sometimes suddenly switches back to default L&F

在有時會在啟動后立即使用多個自己的UI的Java Swing應用程序中(例如,對於JTabbedPane),整個應用程序的外觀(L&F)會更改回默認值。 它迅速顯示出所有正確的內容,然后在一秒鍾或更短的時間內,整個應用程序更改為難看的默認值。

不幸的是,這很難重現。 這種情況很少發生,到目前為止只有在Ubuntu下,當我使用java-1.6.0-openjdk-amd64在Eclipse中直接啟動它時,才發生。 我也安裝了更新的Java版本,但是我使用1.6來測試兼容性。

由於它發生在所有組件上,也可能沒有發生,因此II派生UI似乎無關緊要。 它甚至可以改回不使用自定義UI的小變化:

JTextField textField = new JTextField();
textField.setBorder(null);

因此,如果發生這種情況,邊框將顯示出來。

由於這很難重現,因此我無法給出一個總是發生這種情況的代碼示例。 實際上,上面的例子已經是一個例子,但並非總是如此。 但是,我希望找到遇到類似問題的人,L&F或對L&F的任何更改會突然出現,並且不必要的會變回默認值。 如果是這樣,希望您能分享您的經驗並希望提供解決方案。

----------------編輯:我發現了兩個workaraounds:

  1. 對於邊框問題,我只使用textField.setBorder(new EmptyBorder()); 而不是將其設置為null。
  2. 對於UI的重置,這確實是由於對updateUI的不必要調用而引起的,我為我的自定義擺動對象子類創建了覆蓋updateUI()的子類,例如:

     public class JTabbedPaneNoHeads extends JTabbedPane { public JTabbedPaneNoHeads() { setUI(new GUITabbedPaneNoHeadsUI()); } @Override public GUITabbedPaneNoHeadsUI getUI() { return (GUITabbedPaneNoHeadsUI) ui; } @Override public void updateUI() { /* This was to find out who is calling updateUI: StackTraceElement[] _stackTrace = Thread.currentThread().getStackTrace(); for (StackTraceElement element : _stackTrace ){ System.out.print(element + " -- "); } System.out.println(); */ setUI(new GUITabbedPaneNoHeadsUI()); } } 

現在一切正常。

順便說一句:對updateUI的調用具有以下堆棧跟蹤(由上面的代碼中的注釋塊生成):

livedocket.GUI.design.JTabbedPaneNoHeads.updateUI(JTabbedPaneNoHeads.java:22)
javax.swing.SwingUtilities.updateComponentTreeUI0(SwingUtilities.java:1230)
.... many more of these updateComponentTreeUI0 ...
javax.swing.SwingUtilities.updateComponentTreeUI0(SwingUtilities.java:1245)
javax.swing.SwingUtilities.updateComponentTreeUI(SwingUtilities.java:1221)
javax.swing.plaf.metal.MetalLookAndFeel$AATextListener.updateWindowUI(MetalLookAndFeel.java:2329)
javax.swing.plaf.metal.MetalLookAndFeel$AATextListener.updateAllUIs(MetalLookAndFeel.java:2342)
javax.swing.plaf.metal.MetalLookAndFeel$AATextListener.access$200(MetalLookAndFeel.java:2295)
javax.swing.plaf.metal.MetalLookAndFeel$AATextListener$1.run(MetalLookAndFeel.java:2370)
java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:673)
java.awt.EventQueue.access$300(EventQueue.java:96)
java.awt.EventQueue$2.run(EventQueue.java:634)
java.awt.EventQueue$2.run(EventQueue.java:632)
java.security.AccessController.doPrivileged(Native Method)
java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:108)
java.awt.EventQueue.dispatchEvent(EventQueue.java:643)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

如前所述,這些調用僅在Java 1.6上很少發生。

我在出現線程問題的應用程序中看到了類似的症狀-如果我是我,那么我將仔細檢查是否所有的GUI都是在事件調度線程上構建的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM