Как реализовать панель, которая бы поддерживала перенос строк и разрыв строк? Я бы добавил на эту панель только текстовые метки и разрывы строк. Ярлыки должны располагаться слева направо, переходя к следующей «строке», если нужный. Разрыв строки приведет к переходу на следующую строку. Еще хотелось бы сделать панель вертикально прокручиваемой.
Решение должно работать на Java 5. Можно использовать SwingX.
Уточнение: текстовые метки на самом деле являются JXHyperlink (от SwingX),
т.е. панель содержит интерактивные метки. Это причина, по которой я не могу просто использовать
JTextArea.




ОБНОВЛЕНИЕ: я пропустил запрос на поддержку гиперссылок. Не знаю, как это сделать без использования EditorPane.
JTextArea делает именно то, что вы описали.
JTextArea textArea = new JTextArea();
JScrollPanel sPane = new JScrollPane(textArea);
Есть ли причина против JEditorPane (мне просто любопытно)?
Казалось, что это медленно и излишне. Также я не мог понять, как сохранить объект Java с каждой гиперссылкой на странице, чтобы нажатие на ссылку выполняло какое-то действие в зависимости от объекта.
Слушатель событий Hyperlink выполняет обратный вызов с помощью элемента и URL из тега привязки, который вызвал гиперссылку. Вероятно, вы могли бы создать какое-то сопоставление из URL-> Object для выполнения действий
Верно, у меня сейчас что-то подобное есть. Мне просто интересно, есть ли лучшее решение без такой таблицы сопоставления.
аааа хорошая сделка. Теперь вы меня заинтересовали решением;)
Вы действительно не знаете, как сохранить объект для гиперссылки? В java есть структура данных под названием «Карта» с различными подклассами. У вас может быть map.put (aLink, anObject); и получить объект при использовании какой-либо ссылки. Мне это кажется очень простым.
Хотя это может быть не то решение, которое вы ищете, но исходя из ваших требований, похоже, что пользовательский LayoutManager может достичь того, что вам нужно. Разработав и назначив настраиваемый Диспетчер макетов, который разрешает разрывы строк для Container (например, Panel), должно быть возможно иметь Panel, который разрешает разрывы строк.
Статья Размещение компонентов в контейнере из Учебники по Java предоставит общую информацию о том, как менеджеры компоновки работают в Java, и, в частности, Создание собственного менеджера компоновки предоставит информацию о том, как сделать настраиваемый менеджер компоновки для применения к Container.
Поведение FlowLayout (Диспетчера компоновки по умолчанию для Panel) кажется довольно близким к поведению, которое может вам понадобиться. Добавление функциональности к разрыву строки кажется недостающим элементом.
Предложение: Возможно, у настраиваемого менеджера компоновки может быть возможность добавлять разрыв строки, имея Component, представляющий разрыв строки, который можно добавить к Container с помощью метода add().
Например, есть константа класса Component в настраиваемом диспетчере макета, таком как (гипотетический) LineBreakLayout.LINE_BREAK, и добавление ее в Container может указать диспетчеру настраиваемого макета перейти к следующей строке. Возможно, реализация может быть такой:
Panel p = new Panel(new LineBreakLayout());
p.add(new Label("First Line"));
p.add(LineBreakLayout.LINE_BREAK);
p.add(new Label("Second Line"));
Вышеупомянутый гипотетическийLineBreakLayout затем отобразит первый Label в одной строке и второй Label во второй строке.
альтернативный текст http://img187.imageshack.us/img187/3238/wraprn0.png
Этот образец взят не из панели, то есть контейнера, а из JLabel, который предназначен для отображения содержимого.
Вы можете использовать HTML в своем контенте и использовать <br> на каждом перерыве. Ты должен программно вычислять разрывы в соответствии с вашими правилами изменения размера компонентов.
Вот код:
import javax.swing.*;
import java.awt.*;
public class Wrap {
public static void main( String [] args ) {
JFrame frame = new JFrame("Wrap test");
String text = "<html>This<br>is<br>a<br>multiline<br>label</html>";
frame.add( new JLabel( text ) );
frame.pack();
frame.setVisible( true );
}
}
В соответствии с гиперссылками вы можете использовать прослушиватель мыши. Вы можете добраться до места, где был нажат объект, и использовать карту для выполнения действия. Но, читая ваши комментарии к ответу basszero, я думаю, вам просто не хочется его программировать.
Да, мне не хочется создавать карту, которая отображала бы строки в объекты. Я могу использовать JXHyperlink (от SwingX) для сохранения объекта «в ссылку» и выполнения действия над объектом при щелчке по ссылке. Проблема только в том, как разместить ссылки так, чтобы они помещались в прокручиваемую панель.
Я нашел JTextPane, на который раньше почему-то не обращал внимания. Этот класс делает то, что мне нужно.
Спасибо за вашу помощь. :)
Я хочу сделать ярлыки интерактивными, чтобы они могли вести себя как гиперссылки. Могу ли я сделать это с помощью TextArea? (Я не хочу использовать JEditorPane с HTML.)