Панель с переносом строк и переносом строк в Java Swing

Как реализовать панель, которая бы поддерживала перенос строк и разрыв строк? Я бы добавил на эту панель только текстовые метки и разрывы строк. Ярлыки должны располагаться слева направо, переходя к следующей «строке», если нужный. Разрыв строки приведет к переходу на следующую строку. Еще хотелось бы сделать панель вертикально прокручиваемой.

Решение должно работать на Java 5. Можно использовать SwingX.

Уточнение: текстовые метки на самом деле являются JXHyperlink (от SwingX), т.е. панель содержит интерактивные метки. Это причина, по которой я не могу просто использовать JTextArea.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
8 595
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

ОБНОВЛЕНИЕ: я пропустил запрос на поддержку гиперссылок. Не знаю, как это сделать без использования EditorPane.

JTextArea делает именно то, что вы описали.

JTextArea textArea = new JTextArea();
JScrollPanel sPane = new JScrollPane(textArea);

Я хочу сделать ярлыки интерактивными, чтобы они могли вести себя как гиперссылки. Могу ли я сделать это с помощью TextArea? (Я не хочу использовать JEditorPane с HTML.)

Kaarel 20.01.2009 15:40

Есть ли причина против JEditorPane (мне просто любопытно)?

basszero 20.01.2009 15:47

Казалось, что это медленно и излишне. Также я не мог понять, как сохранить объект Java с каждой гиперссылкой на странице, чтобы нажатие на ссылку выполняло какое-то действие в зависимости от объекта.

Kaarel 20.01.2009 15:52

Слушатель событий Hyperlink выполняет обратный вызов с помощью элемента и URL из тега привязки, который вызвал гиперссылку. Вероятно, вы могли бы создать какое-то сопоставление из URL-> Object для выполнения действий

basszero 20.01.2009 16:13

Верно, у меня сейчас что-то подобное есть. Мне просто интересно, есть ли лучшее решение без такой таблицы сопоставления.

Kaarel 20.01.2009 16:21

аааа хорошая сделка. Теперь вы меня заинтересовали решением;)

basszero 20.01.2009 16:25

Вы действительно не знаете, как сохранить объект для гиперссылки? В java есть структура данных под названием «Карта» с различными подклассами. У вас может быть map.put (aLink, anObject); и получить объект при использовании какой-либо ссылки. Мне это кажется очень простым.

OscarRyz 20.01.2009 22:58

Хотя это может быть не то решение, которое вы ищете, но исходя из ваших требований, похоже, что пользовательский 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, я думаю, вам просто не хочется его программировать.

OscarRyz 20.01.2009 22:56

Да, мне не хочется создавать карту, которая отображала бы строки в объекты. Я могу использовать JXHyperlink (от SwingX) для сохранения объекта «в ссылку» и выполнения действия над объектом при щелчке по ссылке. Проблема только в том, как разместить ссылки так, чтобы они помещались в прокручиваемую панель.

Kaarel 20.01.2009 23:20
Ответ принят как подходящий

Я нашел JTextPane, на который раньше почему-то не обращал внимания. Этот класс делает то, что мне нужно.

Спасибо за вашу помощь. :)

Другие вопросы по теме