2012-05-21 74 views
3

我正在嘗試使用HTML div標記設置JLabel的寬度。帶HTML的JLabel沒有正確設置寬度

考慮下面的代碼:

import javax.swing.*; 

public class Xyzzy extends JFrame{ 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Xyzzy frame = new Xyzzy(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS)); 

       String s = "x "; 
       for (int i=0; i<200; ++i) 
        s += "x "; 

       JLabel jl = new JLabel("<html><div style=\"width: 300px;\">" + s + "</div></html>"); 

       frame.add(jl); 

       frame.setSize(600, 600); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

我本來期望JLabel以300個像素寬,但在現實中卻是寬約390像素。如果我將寬度規格更改爲200px,則生成的標籤寬度大約爲260像素。

我在做什麼錯?

+0

我不知道它是否總是如此,但在你的情況下,尺寸總是比給定寬度大30%,請嘗試使用'float size = 300 /1.3f; JLabel jl = new JLabel(「

" + s + "
」);'尺寸將爲300px。這是一種有線解決方法,我不確定它總是有效,所以我只是將它置於評論中。 –

回答

6

HTML代碼是JLabel的(僅支持HTML規範的一部分) http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JLabel.html
組件的大小取決於佈局過於複雜。 我喜歡MigLayout http://www.miglayout.comsimple tutorial

編輯:HTML中的JLabel是非常過時

+0

另請參閱此[答案](http://stackoverflow.com/a/6785121/230513)。 – trashgod

+0

第一個鏈接真的過時了... –

+0

如果JLabel中的HTML過時,我如何使文本換行?根據[這個鏈接](http://stackoverflow.com/questions/7861724/is-there-some-word-wrap-property-of-jlabel-exist),HTML是要走的路。 – oz1cz

2

你設置的HTML文本,而不是JLabel的寬度的寬度。使用setPreferredSize方法設置JLabel的寬度。

frame.pack(); 

Dimension d = label.getSize(); 
d.width = width; 
label.setPreferredSize(d); 

雖然這是更好地讓JLabel大小本身,使文本以適應,如您所見。

+0

另請參閱此[問與答](http://stackoverflow.com/q/7229226/230513)。 – trashgod

+0

get/setPreferredSize對於我正在使用的佈局無法正常工作。此外,我仍然需要 ...標籤以強制JLabel中的文本進行換行。 – oz1cz

+0

@ClausTøndering:在使用尺寸之前,您必須先弄好框架。我在我的答案中修正了一個錯誤。 –

0

吉爾伯特,我加你的代碼,並結束了與此:

import javax.swing.*; 
import java.awt.*; 

public class Xyzzy extends JFrame{ 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Xyzzy frame = new Xyzzy(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS)); 

       String s = "x "; 
       for (int i=0; i<200; ++i) 
        s += "x "; 

       JLabel jl = new JLabel("<html>" + s + "</html>"); 

       frame.add(jl); 
       frame.pack(); 

       Dimension d = jl.getSize(); 
       d.width = 200; 
       jl.setPreferredSize(d); 

       frame.setSize(600, 600); 

       frame.setVisible(true); 
      } 
     }); 
    } 
} 

這根本不起作用。我也嘗試刪除HTML標籤和frame.setSize(600,600),它們都不會生成我正在尋找的東西:一個200像素寬的JLabel並調整了它的高度。