Hallo!
Für mein Swing Programm verwende ich ein JTextPane in einer JScrollPane um HTML formatierten Text darzustellen. Ich möchte, dass mein JTextPane "letter wrapping" unterstützt, also, dass der Text automatisch umgebrochen wird, wenn er länger als die Breite der JTextPane-Komponente ist (genau das selbe Verhalten wie z.B. in Microsoft Word). Für dieses Problem habe ich unter diesem Link die Lösung gefunden. Es definiert ein eigenes HTMLEditorKit für das JTextPane.
Doch leider funktioniert mit diesem HTMLEditorKit der HTML-Zeilenumbrucht-Tag "<br>" nicht mehr. Ich kenne mich leider nicht genug mit dem HTMLEditorKit aus um den Code entsprechend anzupassen. Ich hoffe jemand hier if Forum weiß eine Lösung..
Hier ein minimaler, verifizierbarer Beispielcode:
Danke!
Für mein Swing Programm verwende ich ein JTextPane in einer JScrollPane um HTML formatierten Text darzustellen. Ich möchte, dass mein JTextPane "letter wrapping" unterstützt, also, dass der Text automatisch umgebrochen wird, wenn er länger als die Breite der JTextPane-Komponente ist (genau das selbe Verhalten wie z.B. in Microsoft Word). Für dieses Problem habe ich unter diesem Link die Lösung gefunden. Es definiert ein eigenes HTMLEditorKit für das JTextPane.
Doch leider funktioniert mit diesem HTMLEditorKit der HTML-Zeilenumbrucht-Tag "<br>" nicht mehr. Ich kenne mich leider nicht genug mit dem HTMLEditorKit aus um den Code entsprechend anzupassen. Ich hoffe jemand hier if Forum weiß eine Lösung..
Hier ein minimaler, verifizierbarer Beispielcode:
Java:
import javax.swing.*;
import javax.swing.text.Element;
import javax.swing.text.ParagraphView;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.InlineView;
import java.awt.*;
public class JTextPaneTest extends JFrame {
public static void main(String[] args) {
new JTextPaneTest();
}
public JTextPaneTest(){
setLayout(new BorderLayout());
JTextPane textPane = new JTextPane();
textPane.setContentType("text/html");
textPane.setEditorKit(new HTMLEditorKitWrapSupport()); // makes JTextPane ignore <br> tag
// example 1 (JTextPane ignores <br> tag when using the custom HTMLEditorKit)
textPane.setText("<html><body style='font-size:22pt'> <p>Line 1 <br> Line 2</p> </body></html>");
// example 2 (the text should be wrapped and the JScrollPane's horizontal bar should not be visible)
//textPane.setText("<html><body style='font-size:25pt'> <p>LONGWORDWITHOUTSPACES_LONGWORDWITHOUTSPACES_LONGWORDWITHOUTSPACES_LONGWORDWITHOUTSPACES_LONGWORDWITHOUTSPACES_</p> </body></html>");
JScrollPane scrollPane = new JScrollPane(textPane);
add(scrollPane, BorderLayout.CENTER);
setSize(new Dimension(500, 500));
setVisible(true);
}
class HTMLEditorKitWrapSupport extends HTMLEditorKit {
@Override
public ViewFactory getViewFactory() {
return new HTMLEditorKit.HTMLFactory() {
public View create(Element element) {
View view = super.create(element);
if (view instanceof InlineView) {
return new InlineView(element) {
@Override
public int getBreakWeight(int axis, float pos, float len) {
return GoodBreakWeight;
}
@Override
public View breakView(int axis, int p0, float pos, float len) {
if (axis == View.X_AXIS) {
checkPainter();
int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len);
if (p0 == getStartOffset() && p1 == getEndOffset()) {
return this;
}
return createFragment(p0, p1);
}
return this;
}
};
} else if (view instanceof ParagraphView) {
return new ParagraphView(element) {
protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements sizeRequirements) {
if (sizeRequirements == null) {
sizeRequirements = new SizeRequirements();
}
float pref = layoutPool.getPreferredSpan(axis);
float min = layoutPool.getMinimumSpan(axis);
// Don't include insets, Box.getXXXSpan will include them.
sizeRequirements.minimum = (int) min;
sizeRequirements.preferred = Math.max(sizeRequirements.minimum, (int) pref);
sizeRequirements.maximum = Integer.MAX_VALUE;
sizeRequirements.alignment = 0.5f;
return sizeRequirements;
}
};
}
return view;
}
};
}
}
}
Danke!