2012-05-21 4 views
3

Я пытаюсь установить ширину JLabel с помощью тега div HTML.JLabel с HTML не задает правильную ширину

Рассмотрим следующий код:

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 пикселей в ширину. Если я изменил спецификацию ширины на 200 пикселей, результирующая метка будет иметь ширину около 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

Edit: HTML в JLabel очень устарела

+0

См. Также этот [ответ] (http://stackoverflow.com/a/6785121/230513). – trashgod

+0

Первая ссылка действительно устарела ... –

+0

Если HTML в JLabel устарел, как мне сделать перенос текста? Согласно [этой ссылке] (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

См. Также [Q & A] (http://stackoverflow.com/q/7229226/230513). – trashgod

+0

get/setPreferredSize не работает должным образом с макетом, который я использую. Кроме того, мне все еще нужны теги ..., чтобы заставить текст в JLabel обернуть. – oz1cz

+0

@Claus Tø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), ни один из которых не создает то, что я ищу: JLabel шириной 200 пикселей и отрегулировал ее высоту.

Смежные вопросы