Swing/OneLineTextPane のバックアップ(No.13)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/OneLineTextPane へ行く。
- 1 (2013-05-06 (月) 00:34:13)
- 2 (2013-05-06 (月) 15:23:34)
- 3 (2013-05-06 (月) 18:01:49)
- 4 (2013-05-06 (月) 21:05:07)
- 5 (2013-07-26 (金) 01:55:46)
- 6 (2013-07-27 (土) 02:00:09)
- 7 (2013-08-18 (日) 04:41:59)
- 8 (2013-08-20 (火) 14:25:17)
- 9 (2013-11-01 (金) 17:53:52)
- 10 (2013-11-02 (土) 03:32:53)
- 11 (2014-09-17 (水) 13:17:20)
- 12 (2014-10-22 (水) 00:49:41)
- 13 (2014-11-08 (土) 01:41:12)
- 14 (2014-11-26 (水) 18:30:10)
- 15 (2015-01-14 (水) 15:33:16)
- 16 (2016-06-20 (月) 14:32:13)
- 17 (2016-06-20 (月) 16:17:59)
- 18 (2017-09-19 (火) 06:33:09)
- 19 (2017-10-27 (金) 16:26:13)
- 20 (2017-11-02 (木) 15:32:16)
- 21 (2019-03-22 (金) 19:00:38)
- 22 (2019-08-15 (木) 14:42:41)
- 23 (2021-04-11 (日) 00:33:28)
- title: JTextPaneを一行に制限してスタイル可能なJTextFieldとして使用する tags: [JTextPane, StyledDocument, JScrollPane, JTextField, KeyboardFocusManager, Focus, InputMap, ActionMap] author: aterai pubdate: 2013-05-06T00:34:13+09:00 description: JTextPaneの行数を一行のみに制限して、文字色などのスタイル付けが可能なJTextFieldとして使用します。
概要
JTextPane
の行数を一行のみに制限して、文字色などのスタイル付けが可能なJTextField
として使用します。
Screenshot
Advertisement
サンプルコード
JTextPane textPane = new JTextPane() {
@Override public void scrollRectToVisible(Rectangle rect) {
int r = getBorder().getBorderInsets(this).right;
rect.grow(r, 0);
super.scrollRectToVisible(rect);
}
};
textPane.setEditorKit(new NoWrapEditorKit());
AbstractDocument doc = new SimpleSyntaxDocument();
textPane.setDocument(doc);
try {
doc.insertString(0, text, null);
} catch (Exception ex) {
ex.printStackTrace();
}
String KEY = "Do-Nothing";
InputMap im = textPane.getInputMap(JComponent.WHEN_FOCUSED);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), KEY);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), KEY);
textPane.getActionMap().put(KEY, new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
// Do nothing
}
});
// @see http://terai.xrea.jp/Swing/FocusTraversalKeys.html
Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(
textPane.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0));
forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.SHIFT_MASK));
textPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
JScrollPane scrollPane = new JScrollPane(
textPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) {
@Override public Dimension getMinimumSize() {
return super.getPreferredSize();
}
};
View in GitHub: Java, Kotlin解説
JScrollPane
に追加JScrollBar
を常に非表示にした、JScrollPane
にJTextPane
を追加
JTextPane
の折り返しを無効化- JEditorPaneで長い行を折り返さないの
ParagraphView
を使用して、折り返しを無効化
- JEditorPaneで長い行を折り返さないの
- 文字列の最後にある
Caret
が表示されないのを修正JTextPane#scrollRectToVisible(Rectangle)
をオーバーライドして、余白までスクロールするように設定- メモ: No Wrap Text Pane ≪ Java Tips Weblogのように、
CaretListener
を使用する方法もある
- Enterキーの無効化
JTextPane
からInputMap
とActionMap
を取得して、KeyEvent.VK_ENTER
をなにもしないAction
で置き換えるDocument#insertString(...)
をオーバーライドして、コピー・ペーストなどで張り込まれた文字列から、改行を空白に置換
- Tabキーでフォーカス移動
- FocusTraversalKeysに矢印キーを追加してフォーカス移動
JTextPane
からInputMap
を取得して、KeyEvent.VK_TAB
をなにもしないAction
で置き換え、JTextPane#setFocusTraversalKeys(...)
で、Tabキーでフォーカス移動するように設定
- 文字スタイルの変更
- JTextPaneでキーワードのSyntaxHighlight
- SyntaxDocument.javaを使って、入力された
red
,green
,blue
の文字色を変更