プログラマメモ2 - programmer no memo2

JTextPaneで行をおりかえさない。 2009/06/24

Javaです。Swingです。JTextPaneです。

もとネタは下記



折り返さないことはできたのですが、スクロールペインが反応してくれなくて、うーん、と悩んだわけです。
で、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);
}
}

: