Java swing текст

254
24 марта 2018, 16:06

Такой вопрос... Есть у меня панелька(JPanel) с BorderLayout. Сверху неё у меня стоит другая панелька с инструментами, а в центре у меня стоит JLabel, который должен отображать полученный в него текст. Текст в моем JLabel должен переносится на следующую строку, если он вылазит за пределы вправо и прокручиваться скролом вниз, если он вылазит за пределы вниз. Проблема вот в чем: Если я текст моего лейбла просто заключаю в теги "<html>...</html>", то он переносится на след. строку, но не скролится, а если я мой лейбл помещаю в JScrollPane, а сам JScrollPane уже ставлю в центр моего BorderLayout, то скрол появляется, но текст не переносится на след. строку, не смотря на то, что прописаны теги "<html>...</html>". Каким образом сделать так, чтобы он и переносился на след. строку и скролился при необходимости?

Answer 1

Для более тонкой работы с JScrollPane компонент может реализовывать интерфейс javax.swing.Scrollable. Если его метод getScrollableTracksViewportWidth возвращает true, ширина компонента будет принудительно установлена равной ширине области прокрутки.

import java.util.Collections;
import java.util.stream.Collectors;
import java.awt.*;
import javax.swing.*;
public class Example {
    // наследник JLabel с поддержкой Scrollable
    static class JScrollableLabel extends JLabel implements Scrollable {
        private static final long serialVersionUID = -1293454226570028624L;
        public JScrollableLabel(String text) {
            super(text);
        }
        // предпочтительные размеры области прокрутки (не важно)
        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return getPreferredSize();
        }
        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }
        // сделать ширину JLabel равной ширине области прокрутки
        @Override
        public boolean getScrollableTracksViewportWidth() {
            return true;
        }
        // возвращает шаг при прокручивании блоком (напр. при щелчке на 
        // пустую область полосы прокрутки).
        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            // переход на размер видимой области
            return orientation == SwingConstants.VERTICAL ? visibleRect.height : visibleRect.width;
        }
        // возвращает шаг при прокручивании при нажатии стрелки
        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 1;
        }
    }
    static void initUi() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
        String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, "
             + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
             + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris "
             + "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in "
             + "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla "
             + "pariatur. Excepteur sint occaecat cupidatat non proident, "
             + "sunt in culpa qui officia deserunt mollit anim id est laborum. ";
        JLabel label = new JScrollableLabel( "<html>" + Collections.nCopies(100, text).stream().collect( Collectors.joining( "</p>\n<p>", "<p>", "</p>" ) ) + "</html>" );
        frame.add( new JScrollPane( label ) );
        frame.setBounds( 200, 200, 400, 400 );
        frame.setVisible( true );
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater( Example::initUi );
    }
}
READ ALSO
Передача данных с телефона на компьютер

Передача данных с телефона на компьютер

Имеется 3 Android-устройства и компьютерНужно сделать так, чтобы вводились данные на телефоне (к примеру на телефоне имеется 2 кнопки, True и False

206
Загрузка файла по сети - Java heap space

Загрузка файла по сети - Java heap space

При копировании файла jdk загоняет его полностью в памятьКод:

257
Можно ли изменить цвет WebView?

Можно ли изменить цвет WebView?

Можно ли изменить цвет webview до того, как загрузилась страница? На секунду появляется белый экран, а только потом загружается сайт

223