Как обернуть текст вокруг компонентов в JTextPane?

Я не понимаю поведение обтекания в JTextPane. Если я вставлю короткий текст, затем JComponent, а затем снова короткий текст, я смогу увидеть вставленный материал в одну строку, если, конечно, фрейм достаточно большой. Но если текст намного длиннее и занимает несколько строк, компонент всегда помещается в новую строку.

Я понял, что после того, как компонент был вставлен в JTextPane, его текст становится длиннее на один символ. Итак, если компонент рассматривается JTextPane как символ, почему он не ведет себя как символ? Может ли это зависеть от версии Java? Я использую Java(TM) SE Runtime Environment (сборка 1.7.0-b147)

Ниже приведен мой код (создайте экземпляр переменной currentText с помощью shortText/longText, чтобы воспроизвести упомянутое поведение):

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JTextPane textPane = new JTextPane();
        textPane.setContentType("text/html");

        String shortText = "one two three four five six seven";
        String longText = "A text component that can be marked up with attributes that are represented graphically. You can find how-to information and examples of using text panes in Using Text Components, a section in The Java Tutorial. This component models paragraphs that are composed of runs of character level attributes. Each paragraph may have a logical style attached to it which contains the default attributes to use if not overridden by attributes set on the paragraph or character run. Components and images may be embedded in the flow of text.";
        String currentText = shortText;

        try {
            // insert text before the component
            textPane.getDocument().insertString(textPane.getDocument().getLength(), currentText,
                    new SimpleAttributeSet());

            textPane.setSelectionStart(textPane.getDocument().getLength());
            textPane.setSelectionEnd(textPane.getDocument().getLength());

            JComboBox component = new JComboBox();
            component.setMaximumSize(component.getPreferredSize());
            textPane.insertComponent(component);

            // insert text after the component
            textPane.getDocument().insertString(textPane.getDocument().getLength(), currentText,
                    new SimpleAttributeSet());

        } catch (BadLocationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        textPane.setEditable(false);

        frame.add(new JScrollPane(textPane));
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

1 ответ

Решение

Такое странное поведение, кажется, происходит из-за установленного вами типа контента. Попробуйте удалить эту строку:

textPane.setContentType ( "text/html" );

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

PS Я не думаю, что использование компонентов Swing внутри текстовой панели (независимо от причины) является хорошим вариантом. Но это только мое мнение...

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