Swing/OneLineTextPane のバックアップの現在との差分(No.14)
- category: swing folder: OneLineTextPane title: JTextPaneを一行に制限してスタイル可能なJTextFieldとして使用する tags: [JTextPane, StyledDocument, JScrollPane, JTextField, KeyboardFocusManager, Focus, InputMap, ActionMap] tags: [JTextPane, StyledDocument, JScrollPane, JTextField, KeyboardFocusManager, Focus, InputMap, ActionMap, Style] author: aterai pubdate: 2013-05-06T00:34:13+09:00 description: JTextPaneの行数を一行のみに制限して、文字色などのスタイル付けが可能なJTextFieldとして使用します。 image:
概要
概要
JTextPane
の行数を一行のみに制限して、文字色などのスタイル付けが可能なJTextField
として使用します。
Screenshot
Advertisement
サンプルコード
サンプルコード
JTextPane textPane = new JTextPane() {
@Override public void scrollRectToVisible(Rectangle rect) {
int r = getBorder().getBorderInsets(this).right;
rect.grow(r, 0);
rect.grow(getInsets().right, 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
}
});
#spandel
// @see http://ateraimemo.com/Swing/FocusTraversalKeys.html
#spanend
#spanadd
// @see https://ateraimemo.com/Swing/FocusTraversalKeys.html
#spanend
Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(
textPane.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0));
#spandel
forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.SHIFT_MASK));
#spanend
#spanadd
forwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK));
#spanend
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
を追加 -
JScrollBar
を常に非表示にしたJScrollPane
にJTextPane
を追加
-
JTextPane
の折り返しを無効化- JEditorPaneで長い行を折り返さないの
ParagraphView
を使用して、折り返しを無効化
- JEditorPaneで長い行を折り返さないの
- 文字列の最後にある
Caret
が表示されないのを修正-
JTextPane#scrollRectToVisible(Rectangle)
をオーバーライドして、余白までスクロールするように設定 - メモ: No Wrap Text Pane ≪ Java Tips Weblogのように、
CaretListener
を使用する方法もある - JEditorPaneで長い行を折り返さないの
ParagraphView
を使用して折り返しを無効化
-
- 文字列の最後に移動した
Caret
が非表示にならないよう修正-
JTextPane#scrollRectToVisible(Rectangle)
をオーバーライドして余白までスクロールするように設定 - No Wrap Text Pane ≪ Java Tips Weblogのように
CaretListener
を使用する方法もある
-
- Enterキーの無効化
-
JTextPane
からInputMap
とActionMap
を取得して、KeyEvent.VK_ENTER
をなにもしないAction
で置き換える -
Document#insertString(...)
をオーバーライドして、コピー・ペーストなどで張り込まれた文字列から、改行を空白に置換 -
JTextPane
からInputMap
とActionMap
を取得してKeyEvent.VK_ENTER
をなにもしないAction
に置き換える -
Document#insertString(...)
をオーバーライドしてコピー・ペーストなどで張り込まれた文字列から改行を空白に置換
-
- Tabキーでフォーカス移動
- FocusTraversalKeysに矢印キーを追加してフォーカス移動
-
JTextPane
からInputMap
を取得して、KeyEvent.VK_TAB
をなにもしないAction
で置き換え、JTextPane#setFocusTraversalKeys(...)
で、Tabキーでフォーカス移動するように設定 -
JTextPane
からInputMap
を取得してKeyEvent.VK_TAB
をなにもしないAction
に置き換え、JTextPane#setFocusTraversalKeys(...)
でTabキーでフォーカス移動するように設定
- 文字スタイルの変更
- JTextPaneでキーワードのSyntaxHighlight
- SyntaxDocument.javaを使って、入力された
red
,green
,blue
の文字色を変更 -
SyntaxDocument.java
を使って入力されたred
、green
、blue
の文字色を変更