Обновление виджета ярлыка для Swing - PullRequest
2 голосов
/ 17 декабря 2009

Есть ли виджет для Swing, который ведет себя как JLabel, который автоматически переформатирует текст, если его размеры изменились? Например:

Large horizontal space available:
+--------------+
| Foo bar baz  |
+--------------+

Small horizontal space available:
+---------+
| Foo bar |
| baz     |
+---------+

В настоящее время я использую JEditorPane с setContentType("text/html") и содержимым HTML. Это работает, но не использует системный шрифт метки по умолчанию для отображения текста. Кроме того, я бы не стал добавлять теги HTML в свой текст - в лучшем случае \n символов будут преобразованы в разрывы строк, а все остальное будет отображаться в виде текста.

Ответы [ 3 ]

7 голосов
/ 17 декабря 2009

Вы можете использовать JTextArea, многострочный текстовый виджет.

JavaDoc: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JTextArea.html

    JTextArea ta = new JTextArea("A JTextArea containing a long text");
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);
    ta.setOpaque(false);
    ta.setEditable(false);
    ta.setFocusable(false);
  • setLineWrap(true) включает упаковку
  • setWrapStyleWord(true) меняет перенос с символьного на текстовый
  • setOpaque(true) делает его непрозрачным, как обычный ярлык
  • setEditable(false) скрывает курсор и запрещает пользователю изменять текст
  • setFocusable(false) запрещает пользователю выбирать текст

Это похоже на обычный JLabel, но оно обернет текст всякий раз, когда ширина слишком мала.

4 голосов
/ 17 декабря 2009

Я не уверен в этом, но я думаю, что стоит попробовать:

Вы можете установить текст JLabel, используя HTML. Это должно позаботиться о проблеме шрифта. Просто сделайте что-то вроде

lbl.setText("<html><body>Foo bar baz</body></html>");

Посмотрите, как ведет себя текст.

Если это работает для вас, вы можете переопределить метод setText() JLabel, чтобы преобразовать \n в <br/> и обернуть тегами html и body вокруг текста.

2 голосов
/ 17 декабря 2009

Я создал пользовательский пользовательский интерфейс для JLabel для поддержки нескольких строк. Это обернет ваш текст в соответствии с доступным пространством, а также с учетом жестких разрывов строк. Обернутый текст должен перерисовываться при изменении размера компонента. Делегат пользовательского интерфейса прослушивает изменения в измерении компонента и автоматически пересчитывает разрывы строк.

Использование делегата пользовательского интерфейса так же просто, как:

JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);

Или альтернативно используйте пользовательский класс MultiLineLabel, который в дополнение к переносу текста поддерживает вертикальное и горизонтальное выравнивание текста.

Вот проект: https://github.com/sasjo/multiline

Если вы скомпилируете и попробуете демонстрационную версию, она должна хорошо перекомпоноваться в OS X. Если я правильно помню, есть некоторая проблема с перекомпоновкой при изменении размера фрейма в Windows. В то время он не обращал на это внимания, но казалось, что событие с измененным размером никогда не распространялось на метку.

...