How to wrap text around components in JTextPane?

I do not understand the wrapper behavior in JTextPane. If I insert short text, then JComponent, and then again short text, I can see the inserted things in one line, if the frame is large enough, of course. But if the text is much longer, so that it takes several lines, the component is always placed on a new line.

I realized that after the component was inserted into the JTextPane, its text becomes one character longer. So, if a component is considered a JTextPane as a symbol, why doesn't it behave like a symbol? Could this depend on the java version? I am using Java (TM) SE Runtime Environment (build 1.7.0-b147)

Below is my code (create an instance of the currentText variable using shortText / longText to reproduce the specified behavior):

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);
    }
}
+5
source share
1 answer

This strange behavior seems to be due to the type of content you choose. Try deleting this line:

textPane.setContentType ( "text/html" );

and you will see that after that everything is fine. I'm not sure why this is happening - it could be either a display error or just the intended behavior.

PS I do not think that using Swing components inside a text panel (whatever the reason) is a good option. But this is just my opinion ...

+3
source

All Articles