JTextFieldにタブ文字を挿入する
Total: 821
, Today: 1
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
JTextField
にキー入力でタブ文字を挿入したり、タブサイズを変更します。
Screenshot
Advertisement
サンプルコード
String txt2 = "aaa\tbbb\tccc";
JTextField field1 = new JTextField(txt2, 20);
initActionInputMap(field1);
int tabSize = 4;
Document doc = new PlainDocument();
doc.putProperty(PlainDocument.tabSizeAttribute, tabSize);
JTextField field2 = new JTextField(doc, txt2, 20);
initActionInputMap(field2);
SpinnerNumberModel model = new SpinnerNumberModel(tabSize, -2, 12, 1);
model.addChangeListener(e -> setTabSize(field2, model.getNumber().intValue()));
JSpinner spinner = new JSpinner(model);
// ...
private static void initActionInputMap(JTextComponent editor) {
String mapKey = "insert-horizontal-tab";
editor.getActionMap().put(mapKey, new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
try {
editor.getDocument().insertString(
editor.getCaretPosition(), "\t", null);
} catch (BadLocationException ex) {
UIManager.getLookAndFeel().provideErrorFeedback(editor);
}
}
});
KeyStroke keyStroke = KeyStroke.getKeyStroke(
KeyEvent.VK_I, InputEvent.CTRL_DOWN_MASK);
editor.getInputMap(WHEN_FOCUSED).put(keyStroke, mapKey);
}
View in GitHub: Java, Kotlin解説
JTextField
: 上- キャレット位置にタブ文字
\t(U+09)
を挿入するAction
をJTextField
のActionMap
に追加 JTextField
のTabキーにはフォーカス移動が設定されているので、Ctrl+Iキーで上記のタブ文字挿入アクションを実行するようInputMap
を設定JTextField
などに使用されるPlainDocument
のデフォルトタブサイズは8
- キャレット位置にタブ文字
JTextField
: 下Document#putProperty(PlainDocument.tabSizeAttribute, 4)
でタブサイズを4
に変更し、これを初期モデルとしてJTextField(Document, String, int)でJTextField
を生成JSpinner
でタブサイズを変更可能に設定- タブサイズに負の値を設定してもエラーなどは発生しないが描画はおかしくなる
- コンストラクタでタブサイズを変更したドキュメントを指定するのではなく、
JTextField#getDocument()
でドキュメントを取得してタブサイズを変更する場合はJTextArea#setTabSize(...)
メソッドのようにBasicTextUI#modelChanged()
を実行してタブサイズのキャッシュを更新する必要がある JTextField
にはsetTabSize(...)
メソッドは存在しないので、このサンプルでは代わりにJTextField#setEditable(false);JTextField#setEditable(true);
、またはJTextField#firePropertyChange("font", 0, 1);
でフォント属性の疑似更新などを実行してBasicTextUI#modelChanged()
を呼び出している
Document doc = editor.getDocument();
if (doc != null) {
doc.putProperty(PlainDocument.tabSizeAttribute, size);
// int old = getTabSize(doc);
// firePropertyChange("tabSize", old, size);
// BasicTextUI#modelChanged();
editor.setEditable(false);
editor.setEditable(true);
// or: editor.firePropertyChange("font", 0, 1);
}