2010-03-12 35 views
1

我正在更新Java Swing應用程序以支持用戶將應用程序字體從正常大小切換到較大大小(因此用戶可以在兩者之間切換運行時大小)。我遇到的一個問題是JTree使用HTML作爲樹節點來爲某些節點中的文本加下劃線(HTML僅嵌入在每個樹節點的JLabel中)。關於節點的另外一件事是,它們是一個自定義組件,在每個JLabel前面添加一個JCheckBox。如何強制JTree中的HTML JLabel在字體更改時調整大小

問題是,一旦JTree可見,增加字體大小會導致節點(包含帶下劃線的文本)不能調整大小。這些節點的HTML似乎阻止節點變寬,所以當字體改變時,文本會被截斷。

我認爲我的選擇是:1)使用另一種方法使文本下劃線,因爲從JLabel中刪除HTML會導致它在字體大小更改時正確調整大小,或2)保持HTML格式並以某種方式強制JTree/JLabels在更新字體大小時調整大小(可能通過觸發屬性更改事件?)。

當字體大小得到更新時,代碼已經調用父JFrame上的SwingUtilities.updateComponentTreeUI()。

編輯:用於更改應用程序中的字體的方法是explained here

任何幫助將不勝感激。提前致謝!

-Mike

+0

這裏最大的問題是:如何在應用程序中更改字體大小?如果沒有回答這個問題,我們不會有任何幫助。 – Riduidel 2010-03-12 08:58:36

+0

感謝您的評論。我已經編輯了這個問題,以包含一個指向之前的SO帖子的鏈接,它解釋了字體如何改變。 – Mike 2010-03-12 12:12:38

回答

2

我無法重新創建您描述的問題。下面是測試程序,它爲我的作品上的JavaSE 6:

public class JTreeFontResize { 
    private static JTree tree; 
    private static JFrame frame; 

    public static void main(String[] args) throws InterruptedException, 
      InvocationTargetException { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      @Override 
      public void run() { 
       tree = new JTree(new Object[] { "One (plain)", 
         "<html><u>Two (HTML)", "<html>Three (HTML)" }); 
       frame = new JFrame("Tree Font Resize"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setBounds(100, 100, 300, 300); 
       frame.add(tree); 
       frame.setVisible(true); 
      } 
     }); 

     Thread.sleep(2000); 
     changeFontSize(20); 

     Thread.sleep(2000); 
     changeFontSize(30); 

     Thread.sleep(2000); 
     changeFontSize(12); 
    } 

    private static void changeFontSize(final int size) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Font font = new Font("Vernanda", Font.PLAIN, size); 
       FontUIResource fontResource = new FontUIResource(font); 
       Enumeration<Object> keys = UIManager.getDefaults().keys(); 
       while (keys.hasMoreElements()) { 
        Object key = keys.nextElement(); 
        Object value = UIManager.get(key); 
        if (value instanceof FontUIResource) { 
         UIManager.put(key, fontResource); 
        } 
       } 
       SwingUtilities.updateComponentTreeUI(frame); 
      } 
     }); 
    } 
} 

如果您上述作品,那麼也許你應該張貼您的問題代碼削減版本。

+0

這是正確的答案。基於上面的一些額外的測試之後,問題在於用於向每個樹節點添加複選框的自定義組件。謝謝您的幫助! – Mike 2010-03-15 14:23:02

相關問題