Swing/TextFieldOnReadOnlyTextPane のバックアップの現在との差分(No.1)
TITLE:JTextFieldを編集不可のJTextPaneに追加する
Posted by aterai at 2013-02-11
JTextFieldを編集不可のJTextPaneに追加する
`JTextField
を空欄として編集不可にした
JTextPane
`に追加します。
- category: swing folder: TextFieldOnReadOnlyTextPane title: JTextFieldを編集不可のJTextPaneに追加する tags: [JTextPane, JTextField, JScrollPane, Focus] author: aterai pubdate: 2013-02-11T00:11:13+09:00 description: JTextFieldを空欄として編集不可にしたJTextPaneに追加します。 image:
概要
JTextField
を空欄として編集不可にしたJTextPane
に追加します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
サンプルコード
#spandel
void insertQuestion(final JTextPane textPane, String str) {
#spanend
#spanadd
private static void insertQuestion(JTextPane textPane, String str) {
#spanend
Document doc = textPane.getDocument();
try{
try {
doc.insertString(doc.getLength(), str, null);
final int pos = doc.getLength();
#spanadd
#spanend
int pos = doc.getLength();
System.out.println(pos);
final JTextField field = new JTextField(4) {
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() {
field.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
field.addFocusListener(new FocusAdapter() {
@Override public void focusGained(FocusEvent e) {
try{
try {
Rectangle rect = textPane.modelToView(pos);
rect.grow(0, 4);
rect.setSize(field.getSize());
// System.out.println(rect);
// System.out.println(field.getLocation());
textPane.scrollRectToVisible(rect);
}catch(BadLocationException ex) {
ex.printStackTrace();
} catch (BadLocationException ex) {
// should never happen
RuntimeException wrap = new StringIndexOutOfBoundsException(
ex.offsetRequested());
wrap.initCause(ex);
throw wrap;
}
}
@Override public void focusLost(FocusEvent e) {}
});
Dimension d = field.getPreferredSize();
int baseline = field.getBaseline(d.width, d.height);
field.setAlignmentY(baseline/(float)d.height);
field.setAlignmentY(baseline / (float) d.height);
SimpleAttributeSet a = new SimpleAttributeSet();
// MutableAttributeSet a = new SimpleAttributeSet();
MutableAttributeSet a = textPane.getStyle(StyleContext.DEFAULT_STYLE);
StyleConstants.setLineSpacing(a, 1.5f);
textPane.setParagraphAttributes(a, true);
textPane.insertComponent(field);
doc.insertString(doc.getLength(), "\n", null);
}catch(BadLocationException e) {
e.printStackTrace();
} catch (BadLocationException ex) {
// should never happen
RuntimeException wrap = new StringIndexOutOfBoundsException(
ex.offsetRequested());
wrap.initCause(ex);
throw wrap;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、編集不可にした`JTextPane
内の文字列中に、編集可能な空欄として
JTextField
を追加(
JTextPane#insertComponent(...)
`を使用)しています。
解説
上記のサンプルでは、編集不可状態のJTextPane
内の文字列中に編集可能なJTextField
をJTextPane#insertComponent(...)
メソッドを使用して追加しています。
- `
JTextPane
` -
JTextPane
- 編集不可に設定
- 行間を`
1.5
`倍に設定 - 行間を
1.5
倍に設定
- `
JTextField
`- `
JTextField#getMaximumSize()
`をオーバーライドして幅を制限 - `
JTextFieldにMatteBorder
`を設定して下線のみ表示 - `
JTextField#setAlignmentY(...)
`でベースラインを揃える
- `
-
JTextField
-
JTextField#getMaximumSize()
をオーバーライドして幅を制限 -
JTextField
にMatteBorder
を設定して下線のみの空欄を表示 -
JTextField#setAlignmentY(...)
でベースラインを揃える - `
JTextField
に
FocusListener
を追加し、
TAB
キーなどで
Focus
が移動したら、その
JTextField
`までスクロールするように設定 -
JTextField
にFocusListener
を追加してTabキーなどでFocus
が移動したら、そのJTextField
までスクロールするように設定
-