Такой вопрос... Есть у меня панелька(JPanel) с BorderLayout. Сверху неё у меня стоит другая панелька с инструментами, а в центре у меня стоит JLabel, который должен отображать полученный в него текст. Текст в моем JLabel должен переносится на следующую строку, если он вылазит за пределы вправо и прокручиваться скролом вниз, если он вылазит за пределы вниз. Проблема вот в чем: Если я текст моего лейбла просто заключаю в теги "<html>...</html>"
, то он переносится на след. строку, но не скролится, а если я мой лейбл помещаю в JScrollPane, а сам JScrollPane уже ставлю в центр моего BorderLayout, то скрол появляется, но текст не переносится на след. строку, не смотря на то, что прописаны теги "<html>...</html>"
. Каким образом сделать так, чтобы он и переносился на след. строку и скролился при необходимости?
Для более тонкой работы с 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 );
}
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Имеется 3 Android-устройства и компьютерНужно сделать так, чтобы вводились данные на телефоне (к примеру на телефоне имеется 2 кнопки, True и False
При копировании файла jdk загоняет его полностью в памятьКод:
Можно ли изменить цвет webview до того, как загрузилась страница? На секунду появляется белый экран, а только потом загружается сайт