Re: JTextPane line wrap c
To: comp.lang.java.gui
1. Sun officially acknowledged that this is a bug (see below). It also
appears in jre version 1.6.
2. I have a workaround (see far below). With this workaround the
wrapping behavior seems to work like it used to even on new versions
of the JRE.
************************ From Sun ******************************
Hi Reinhard Engels,
Thank you for reporting this issue.
We have determined that this report is a new bug and entered the bug
into our internal bug tracking system under Bug Id: 6539700.
You can monitor this bug on the Java Bug Database at
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6539700.
It may take a day or two before your bug shows up in this external
database. As you are a member of the Sun Developer Network (SDN),
there are two additional options once the bug is visible.
1. Voting for the bug
Click http://bugs.sun.com/bugdatabase/addVote.do?bug_id=6539700.
2. Adding the report to your Bug Watch list.
You will receive an email notification when this bug is updated.
Click http://bugs.sun.com/bugdatabase/addBugWatch.do?bug_id=6539700.
SDN members can obtain fully licensed Java IDEs for web and enterprise
development. More information is at http://developers.sun.com/prodtech/javatools/free/.
We greatly appreciate your efforts in identifying areas in the J2SE
where we can improve upon and I would request you to continue doing
so.
************************ End From Sun ******************************
************************ The workaround (same code as previously
posted, plus an (inner) subclass of StyledEditorKit) ************
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.BoxView;
import javax.swing.text.ComponentView;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.IconView;
import javax.swing.text.LabelView;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.ParagraphView;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
public class JTextPaneWrapChangeDemo {
public JTextPaneWrapChangeDemo() {
super();
}
public static void main(String[] args) {
JTextPaneWrapChangeDemo demo = new JTextPaneWrapChangeDemo();
demo.run();
}
public void run() {
JFrame frame = new JFrame();
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane(textPane);
frame.add(scrollPane);
textPane.setEditable(false);
textPane.setEditorKit(new BioSequenceStyledEditorKit());
textPane.setFont(new Font("Courier", Font.PLAIN, 12));
MutableAttributeSet exonAttributeSet = new
SimpleAttributeSet();
MutableAttributeSet intronAttributeSet = new
SimpleAttributeSet();
StyleConstants.setFontSize(exonAttributeSet, 12);
StyleConstants.setForeground(exonAttributeSet, Color.blue);
StyleConstants.setFontSize(intronAttributeSet, 12);
StyleConstants.setForeground(intronAttributeSet, Color.black);
try {
Document d = textPane.getDocument();
d.insertString(d.getLength(), exon1, exonAttributeSet);
d.insertString(d.getLength(), intron1,
intronAttributeSet);
d.insertString(d.getLength(), exon2, exonAttributeSet);
d.insertString(d.getLength(), intron2,
intronAttributeSet);
d.insertString(d.getLength(), exon3, exonAttributeSet);
} catch (BadLocationException e) {
System.out.println("bad location exception" + e);
}
frame.show();
}
String exon1 =
"ATGCCACCAAAAGCGCGTATAAACTCAAAAAATTCAGTTGAGCAGGAGGGAAGGGTCCTACTTGCAGTATCAGCTTTGAAAAATAAGGAAATTCTCAATATTCGTGAAGCTGCGCGTGTCTATAATGTGCCTTATACTACCCTCCAGCGGCGCCTAAAGGGGCATACTTTTCGAGCTGAATTACGCGCAAATGGCCATAAAATGACTCAGAATGAAGAGGATTCACTTATTAGATGGATTCTATCTATGGATCAACGTGGAGCGGCTCCCCGACCGTCCCATGTACGAGAAATGGCGAATATCCTGCTTGCGCAGCGTGGTTCAACTCCTACCCAGACTGTTGGAGAGAAATGGGTATATAACTTCATTAATCGGCATGATGAGATCAAAACCCGATTCTCTAGGCGCTATAACCACCAGCGTGCTAAATGTGAAGACCCAAAGATTATCCTGGAATGGTTCAATCGTGTCCAGATCACAATAATGCAGCATGGGATTACACTGGAAGATA
TCTACAACTTTGATGAAACTGGCTTTGCAATGGGCTTAGTAGCTACTGCTAAG";
String intron1 =
"GTAGTTACAAGAGCTGAGATGCTTAGTCGGCCCTTCCTTATCCAGCCAGGGAACCGCGAATGGGTTACCTCTATAGAGTGTATTAACTCTACTGGCTGGGTGCTTCCACCATGCATTATCTTCAAGGGAAAGGTCCATATTGAGGACTGGTATTAAGATACAGCCTTACCAGCAGACTGGCGGATCGAGGTCAGTGAGAATGGATGGACGACTGATCAGATTGGATTACGATGGCTTCAAAAAGTCTTTATTCCTGCTACTACCAGTCGTACAACTGGTAGATATCGACTATTAATTCTTGATGGCCATGGGAGCCATCTAACACCACAGTTTGATCAAATCTGCACTGAGAATGATATCATTCCAATCTGCATGCCTGCACATTCATCACATCTCCTCCAGCCTCTAGATGTTGGCTGTTTCTCTCCTCTTAAGCGTGCGTATGGCCGCTTGATTGAGGATAAGATGCGGCTTGGTTTCAACCATATTGACAAGTTTGATTTCCTTGAGG
CCTATCCACAAGCTCATACGGCAATCTTTTCAGCAGATAATATTAAAAGTGGCTTTTCAGCAACTGGATTAATACCACTGAATCCAGATCGGGTGCTCAGTCAGCTTAATATCCAGCTTAGAACACCTACACCACCAGGCAGCCGATCAACTAATTCTGTCCCAAAAACACCTTACAATCTCAAGCA";
String exon2 =
"GCTGAAGAAGCAGGAAACTACGCTTAAGAAGCTACTTAGGGAGCGTACATACAGCCCTCCTACCCCTACAAAGGCTGTGCTAGGTCAGATTATCAAGGGGTGTGAGATGGCAATGAATAACGCTGCCCTTCTTGCAAAGGAAAATCATGATCTACGTGCTGCACATGAAAAGCACCTTCAAAAGCAGAAGCGATCTAGGCGGCAGATAGAAACTGCA";
String intron2 =
"GTGGGATTATCTATCCAGGAAGGGCAGGAGATCATTTAACGCAGGGATCAGGCTGCTGAAGCTATCCCAACTATCCCTCCAGAGCAGGTAGTAGATACAGAACAACGCCCTCAACGGGCACCCCCACGCTGCAGTGACTGCCATATTCTAGGCCATAGGCGATTGCAATGTCCGCAGCGCAAGAATAACTAGATTTAGTAATAAAATCATGTTTTAGGGGTTCAAAATAGCCTCCAATTTCGGCCGCGGCCAAATTCTATAG";
String exon3 =
"TATGGTGATCCGCTCGGTTACGTGATCCGCTCGCTTACCGATTACGTTACTTCTCTGGAAGACGATCCTGGACTAAGTCATTTCCTTTTGCGTAGTTCAGCGGATTTTTTTTTTCTTCTGCTACTTGGGGTCGCTGAAGATGGAATCAATCAGACGT";
class BioSequenceStyledEditorKit extends StyledEditorKit {
ViewFactory defaultFactory = new WrapColumnFactory();
public ViewFactory getViewFactory() {
return defaultFactory;
}
public BioSequenceStyledEditorKit() {
super();
}
class BioSequenceLabelView extends LabelView {
public BioSequenceLabelView(Element elem) {
super(elem);
}
public int getBreakWeight(int axis, float pos, float len)
{
if (axis == View.X_AXIS) {
checkPainter();
int p0 = getStartOffset();
int p1 =
getGlyphPainter().getBoundedPosition(this, p0,
pos, len);
if (p1 == p0) {
// can't even fit a single character
return View.BadBreakWeight;
}
// if (getBreakSpot(p0, p1) != -1) {
// return View.ExcellentBreakWeight;
// }
// Nothing good to break on.
return View.GoodBreakWeight;
}
return super.getBreakWeight(axis, pos, len);
}
}
class WrapColumnFactory implements ViewFactory {
public View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
if
(kind.equals(AbstractDocument.ContentElementName)) {
return new BioSequenceLabelView(elem);
} else if (kind
.equals(AbstractDocument.ParagraphElementName))
{
return new ParagraphView(elem);
} else if
(kind.equals(AbstractDocument.SectionElementName)) {
return new BoxView(elem, View.Y_AXIS);
} else if
(kind.equals(StyleConstants.ComponentElementName)) {
return new ComponentView(elem);
} else if
(kind.equals(StyleConstants.IconElementName)) {
return new IconView(elem);
}
}
return new LabelView(elem);
}
}
}
}
---
* Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24