JTextPane - размер соответствует содержимому

Что у меня есть -

Что мне нужно -

Код:

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JTextPane pane = new JTextPane();
pane.setText("Long string Long string Long string Long string Long string Long string");
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.add(pane);
panel.add(new JButton("Button"));
frame.add(panel);
frame.show();

Если я выполню frame.pack(), я получу очень длинное окно без переноса слов!


person Iaroslav Baranov    schedule 07.05.2015    source источник
comment
@AndrewThompson, да, форматирование HTML приемлемо. Как я могу решить проблему с CSS?   -  person Iaroslav Baranov    schedule 07.05.2015
comment
См. этот связанный ответ: [stackoverflow.com/questions/22072975/ [1]: stackoverflow.com/questions/22072975/   -  person Sharcoux    schedule 13.05.2015


Ответы (1)


Для любого компонента Swing с поддержкой HTML ширина может быть установлена ​​для body с помощью стилей HTML (CSS). Это, в свою очередь, определит количество отображаемых строк и, исходя из этого, предпочтительную высоту текстового компонента. Установка ширины в CSS позволяет избежать необходимости вычислять, где должны быть разрывы строк (или оптимальный размер) компонента.

В более общем плане см. Как использовать HTML в компонентах Swing.

E.G.

import javax.swing.*;

public class FixedWidthLabel {

    public static void main(String[] srgs) {
        final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus.";
        final String html1 = "<html><body style='width: ";
        final String html2 = "px'>";

        Runnable r = new Runnable() {

            @Override
            public void run() {
                JOptionPane.showMessageDialog(
                        null, new JLabel(html1 + "200" + html2 + s));
                JOptionPane.showMessageDialog(
                        null, new JLabel(html1 + "300" + html2 + s));
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

введите здесь описание изображениявведите здесь описание изображения

person Andrew Thompson    schedule 07.05.2015
comment
Спасибо, это работает для pane.setContentType(text/html); - person Iaroslav Baranov; 07.05.2015
comment
Но как установить ширину для StyledDocument без setContentType(text/html)? Является ли это возможным? - person Iaroslav Baranov; 07.05.2015
comment
Вы должны сделать это с предпочтительным размером. Я сейчас со своим телефоном, но поищите другие мои ответы на ту же тему, чтобы узнать, как это сделать. Ссылку скину, когда воссоединюсь с компом. - person Sharcoux; 08.05.2015