2013-05-17 3 views
1

У меня проблема с JLabel и простой текстовой оболочкой. Для простой текстовой упаковки я использую LabelView, и я не очень доволен результатом, который он дает мне.JLabel обертывание обычного текста как JTextArea

Моей целью является получение простой текстовой упаковки, например, JTextArea. Я пробовал WrappedPlainView, но он работает только с JTextComponent

Так что мой вопрос может быть, вы, ребята, знаете или имеете некоторые предварительные JLabel просмотров?

примечание: я не хочу добавлять html в свой обычный текст.

LabelView: http://docs.oracle.com/javase/6/docs/api/javax/swing/text/LabelView.html

WrappedPlainView: http://docs.oracle.com/javase/6/docs/api/javax/swing/text/WrappedPlainView.html

Попробуйте этот пример и посмотрим, как слова врапит изменен размер рамки:

import javax.swing.*; 
import java.awt.*; 
public class Example extends JFrame { 
private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + 
             "Ut in enim velit. Nunc posuere purus ac odio dictum auctor. " + 
             "Vivamus nec sem mi. Curabitur sed iaculis nibh. Proin vel massa augue. " + 
             "Aenean laoreet, tellus ut vulputate mollis, justo eros ornare tortor, " + 
             "vitae venenatis turpis augue id purus. In quis pretium justo. " + 
             "Quisque interdum sem at augue ultrices molestie. " + 
             "Nulla consectetur magna nec est malesuada sed ultricies diam gravida. " + 
             "Curabitur luctus, nulla nec pulvinar fringilla, enim turpis luctus tellus, " + 
             "non auctor diam ligula quis lectus."; 

public Example() 
{ 
    JTextArea textArea = new JTextArea(LONG_TEXT); 
    textArea.setWrapStyleWord(true); 
    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    textArea.setOpaque(false); 
    textArea.setEditable(false); 

    add(new JScrollPane(textArea), BorderLayout.CENTER); 
    setMinimumSize(new Dimension(100, 100)); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setVisible(true); 
} 

public static void main(String []args) 
{ 
    new Example(); 
} 
} 

Посмотрите на этот пример, и вы увидите, проблема с словами обертывания JLabel:

import javax.swing.*; 
import java.awt.*; 
public class Example extends JFrame { 
private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + 
             "Ut in enim velit. Nunc posuere purus ac odio dictum auctor. " + 
             "Vivamus nec sem mi. Curabitur sed iaculis nibh. Proin vel massa augue. " + 
             "Aenean laoreet, tellus ut vulputate mollis, justo eros ornare tortor, " + 
             "vitae venenatis turpis augue id purus. In quis pretium justo. " + 
             "Quisque interdum sem at augue ultrices molestie. " + 
             "Nulla consectetur magna nec est malesuada sed ultricies diam gravida. " + 
             "Curabitur luctus, nulla nec pulvinar fringilla, enim turpis luctus tellus, " + 
             "non auctor diam ligula quis lectus."; 

public Example() 
{ 
    JLabel label = new JLabel(LONG_TEXT); 
    add(label, BorderLayout.CENTER); 
    setMinimumSize(new Dimension(100, 100)); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setVisible(true); 
} 

public static void main(String []args) 
{ 
    new Example(); 
} 
} 

Итак, цель состоит в том, чтобы получить слова JLabel, как в JTextArea.

ПРИМЕЧАНИЕ: в реальном проекте я работаю с javax.swing.text.View`s, и я использую LabelView для простого текста.

+0

Для более эффективной помощи следует отправить сообщение [SSCCE] (http://sscce.org/). ;) –

+1

@Mode Уже после вашего редактирования вопроса вам нелегко дать вам совет. Пожалуйста, рассмотрите комментарий Андрея и подготовьте SSCCE. Также покажите и опишите, что вам не нравится в «LabelView», и что вы хотите достичь. – Howard

+0

@Mode посмотри мой обзор вертолета в моей первой попытке повторной попытки – mKorbel

ответ

3

Так что мой вопрос был бы, возможно, вы, ребята, знаете/или иметь некоторые предварительные взгляды JLabel,

есть два способа,

  • использование JTextComponent

    1. non_editable, setEditable()
    2. изменение setDisabledTextColor()
    3. (только если needded) для обеспечения прозрачности (JLabel по умолчанию), вы можете изменить Непрозрачность

.

  • использование JLabel с Html (уменьшенная и реализована up_to версия Html3.2)

  • пост и SSCCE

EDIT:

Примечание: в реальном проекте я Я работаю с javax.swing.text.View`s и i с использованием LabelView для простого текста.

для JTextComponents и javax.swing.text.Xxx требуется использовать intial PreferredSize см public JTextArea(String text, int rows, int columns)

добавить 1) использовать JTextComponent

должно быть решение о

  • если завернуты в JScrollPane или без с видимым JScrollBar (override MouseScroll)

  • или просто добавлен в контейнер, я предложил бы использовать BorderLayout или GridLayout, то JTextArea изменяемого размера (выглядит как), с контейнером слишком

  • прокрутки JComponents будут добавлены JScrollPane

.

import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.border.EmptyBorder; 

public class ExampleJTextArea extends JFrame { 

    private /*static*/ final String LONG_TEXT = "Lorem ipsum dolor sit amet, " 
      + "consectetur adipiscing elit. Ut in enim velit. Nunc posuere " 
      + "purus ac odio dictum auctor. Vivamus nec sem mi. Curabitur sed " 
      + "iaculis nibh. Proin vel massa augue. Aenean laoreet, tellus ut " 
      + "vulputate mollis, justo eros ornare tortor, vitae venenatis " 
      + "turpis augue id purus. In quis pretium justo. Quisque interdum " 
      + "sem at augue ultrices molestie. Nulla consectetur magna nec est " 
      + "malesuada sed ultricies diam gravida. Curabitur luctus, nulla " 
      + "nec pulvinar fringilla, enim turpis luctus tellus, non auctor " 
      + "diam ligula quis lectus."; 

    public ExampleJTextArea() { 
     JTextArea textArea = new JTextArea(LONG_TEXT, 10, 25); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     textArea.setOpaque(false); 
     textArea.setEditable(false); 
     textArea.setBorder(new EmptyBorder(10,10,2,2)); 
     add(/*new JScrollPane(*/textArea/*), BorderLayout.CENTER*/); 
     //setMinimumSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ExampleJTextArea exampleJTextArea = new ExampleJTextArea(); 
      } 
     }); 
    } 
} 

.

.

добавить 2) use JLabel with Html (reduced and implemented up_to version Html3.2), and another variations

+0

, но если я работаю с представлениями? Это не будет работать. – Mode

+0

:-) Что не работает, это было причиной назвать это как 1-й. попытка :-) – mKorbel

+0

Пример показывает только то, что я хочу получить. Работа с представлениями «У меня нет JComponents». У меня есть Views, например LabelView, который добавлен в Shape для представления текста. – Mode

0

Я также согласен с @mKorbel, что есть два пути достижения надлежащего обертывания слова через JLabel:

а) Создайте свой собственный компонент, который эмулирует JLabel стиль, оберточная бумага.

public class CustomWrappedLabel extends JTextArea { 
    public CustomWrappedLabel(String text) { 
     super(text); 
     setBackground(null); 
     setEditable(false); 
     setBorder(null); 
     setLineWrap(true); 
     setWrapStyleWord(true); 
     setFocusable(false); 
    } 
} 

Использование:

new CustomWrappedLabel("Hey you've just tried multi-line text!"); 

Убедитесь, что вы установили количество строк больше, чем 2 линии для достижения требуемого поведения. wrappedLabelObj.setRows(2). Используйте pack(), чтобы правильно вычислить высоту родительского компонента.

b) Используйте html, который автоматически позаботится об обернутом тексте внутри метки <html>.

new JLabel("<html>Hey you've just tried html multi-line text version!</html>") 

Вы можете использовать <br /> для перевода строки.

Надеюсь, это поможет!

+0

Я не могу использовать HTML. – Mode

+0

У вас есть и другая альтернатива, а также вариант (a). – Deminem

0

Очень старая нить, но в случае, если кто-то приходит через эту проблему снова ...

Ни одно из этих решений, казалось, не работать для меня (возможно, это происходит потому, что JPanel, содержавшие мой JLabel был просмотрен JScrollPane ?), и я не мог заставить JTextAreas работать, потому что у него есть какая-то неудобная ошибка, где она растет, но не будет сокращаться.

Вместо этого, здесь является самым простым решением я мог бы найти для упаковки текста в JLabel, при условии, Тони Фект на this page: Просто используйте setPreferredSize() на HTML-формате JLabel, и она будет запускаться автоматически растет и сокращается!

panel = new JPanel(); 
JLabel label = new JLabel("<html>" + "long text to display" + "</html>"); 
label.setPreferredSize(new Dimension(1, 1)); // this is the key part. 
panel.add(label, "grow");