JTextPaneで行をおりかえさない。
2009/06/24
java
swing
Javaです。Swingです。JTextPaneです。
もとネタは下記
- Swing - Stretching background colour across whole JTextPane for one line of text
- JEditorPaneで長い行を折り返さない - Java Swing Tips
折り返さないことはできたのですが、スクロールペインが反応してくれなくて、うーん、と悩んだわけです。
で、JTextArea(BasicTextAreaUI)の実装をぱらぱらみてて、JTextAreaは、WrappedPlainViewというものを使っていて、よくよくみると折り返し(wrap)しない場合は、javax.swing.text.PlainViewを使ってました。
Swing - Stretching background colour across whole JTextPane for one line of textでは、いろいろスクロールペインを効かせるためのコードがのってるようでしたが、いっそPlainViewを使ってしまえということで、下記のコード。
package a;
import javax.swing.*;
import javax.swing.text.*;
/**
*
* http://forums.sun.com/thread.jspa?threadID=622683
*
*
*/
public class NoWrapEditorKit extends StyledEditorKit {
public ViewFactory getViewFactory() {
return new StyledViewFactory();
}
static class StyledViewFactory implements ViewFactory {
public View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
if (kind.equals(AbstractDocument.ContentElementName)) {
return new LabelView(elem);
} else if (kind.equals(AbstractDocument.ParagraphElementName)) {
return new ParagraphView(elem);
} else if (kind.equals(AbstractDocument.SectionElementName)) {
// return new NoWrapBoxView(elem, View.Y_AXIS);
// return new WrappedPlainView(elem, false);
return new PlainView(elem);
} else if (kind.equals(StyleConstants.ComponentElementName)) {
return new ComponentView(elem);
} else if (kind.equals(StyleConstants.IconElementName)) {
return new IconView(elem);
}
}
return new LabelView(elem);
}
}
static class NoWrapBoxView extends BoxView {
public NoWrapBoxView(Element elem, int axis) {
super(elem, axis);
}
public void layout(int width, int height) {
super.layout(1024, height);
}
}
public static void main(String[] args) throws Exception {
JTextPane textPane = new JTextPane();
textPane.setEditorKit(new NoWrapEditorKit());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JScrollPane(textPane));
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
import javax.swing.*;
import javax.swing.text.*;
/**
*
* http://forums.sun.com/thread.jspa?threadID=622683
*
*
*/
public class NoWrapEditorKit extends StyledEditorKit {
public ViewFactory getViewFactory() {
return new StyledViewFactory();
}
static class StyledViewFactory implements ViewFactory {
public View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
if (kind.equals(AbstractDocument.ContentElementName)) {
return new LabelView(elem);
} else if (kind.equals(AbstractDocument.ParagraphElementName)) {
return new ParagraphView(elem);
} else if (kind.equals(AbstractDocument.SectionElementName)) {
// return new NoWrapBoxView(elem, View.Y_AXIS);
// return new WrappedPlainView(elem, false);
return new PlainView(elem);
} else if (kind.equals(StyleConstants.ComponentElementName)) {
return new ComponentView(elem);
} else if (kind.equals(StyleConstants.IconElementName)) {
return new IconView(elem);
}
}
return new LabelView(elem);
}
}
static class NoWrapBoxView extends BoxView {
public NoWrapBoxView(Element elem, int axis) {
super(elem, axis);
}
public void layout(int width, int height) {
super.layout(1024, height);
}
}
public static void main(String[] args) throws Exception {
JTextPane textPane = new JTextPane();
textPane.setEditorKit(new NoWrapEditorKit());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JScrollPane(textPane));
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
: