Swing/TextFieldOnReadOnlyTextPane のバックアップ差分(No.2)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/TextFieldOnReadOnlyTextPane へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTextFieldを編集不可のJTextPaneに追加する
#navi(../)
#tags(JTextPane, JTextField, JScrollPane, Focus)
RIGHT:Posted by &author(aterai); at 2013-02-11
*JTextFieldを編集不可のJTextPaneに追加する [#e24a9325]
``JTextField``を空欄として編集不可にした``JTextPane``に追加します。
-&jnlp;
-&jar;
-&zip;
//#screenshot
#ref(https://lh4.googleusercontent.com/-N1aQ1F9Zrn8/UReetdvfWQI/AAAAAAAABdc/9J_2lkAgW0Y/s800/TextFieldOnReadOnlyTextPane.png)
**サンプルコード [#y583333f]
#code(link){{
void insertQuestion(final JTextPane textPane, String str) {
Document doc = textPane.getDocument();
try{
doc.insertString(doc.getLength(), str, null);
final int pos = doc.getLength();
System.out.println(pos);
final JTextField field = new JTextField(4) {
@Override public Dimension getMaximumSize() {
return getPreferredSize();
}
};
field.setBorder(BorderFactory.createMatteBorder(0,0,1,0,Color.BLACK));
field.addFocusListener(new FocusListener() {
@Override public void focusGained(FocusEvent e) {
try{
Rectangle rect = textPane.modelToView(pos);
rect.grow(0, 4);
rect.setSize(field.getSize());
textPane.scrollRectToVisible(rect);
}catch(BadLocationException ex) {
ex.printStackTrace();
}
}
@Override public void focusLost(FocusEvent e) {}
});
Dimension d = field.getPreferredSize();
int baseline = field.getBaseline(d.width, d.height);
field.setAlignmentY(baseline/(float)d.height);
SimpleAttributeSet a = new SimpleAttributeSet();
StyleConstants.setLineSpacing(a, 1.5f);
textPane.setParagraphAttributes(a, true);
textPane.insertComponent(field);
doc.insertString(doc.getLength(), "\n", null);
}catch(BadLocationException e) {
e.printStackTrace();
}
}
}}
**解説 [#kcf658d9]
上記のサンプルでは、編集不可にした``JTextPane``内の文字列中に、編集可能な空欄として``JTextField``を追加(``JTextPane#insertComponent(...)``を使用)しています。
- ``JTextPane``
-- 編集不可に設定
-- 行間を``1.5``倍に設定
--- [[JEditorPaneやJTextPaneに行間を設定する>Swing/LineSpacing]]
- ``JTextField``
-- ``JTextField#getMaximumSize()``をオーバーライドして幅を制限
-- ``JTextFieldにMatteBorder``を設定して下線のみ表示
-- ``JTextField#setAlignmentY(...)``でベースラインを揃える
--- [[JTextPaneに追加するコンポーネントのベースラインを揃える>Swing/InsertComponentBaseline]]
-- ``JTextField``に``FocusListener``を追加し、``TAB``キーなどで``Focus``が移動したら、その``JTextField``までスクロールするように設定
//**参考リンク
**コメント [#b8c6c78c]
#comment