Swing/ScrollingCellEditor のバックアップの現在との差分(No.1)
TITLE:TableCellEditorをスクロール可能にする
Posted by aterai at 2011-06-20
TableCellEditorをスクロール可能にする
JTableのTableCellEditorとして、JTextAreaとJScrollPaneを使用します。- category: swing folder: ScrollingCellEditor title: TableCellEditorをスクロール可能にする tags: [JTable, JScrollPane, JTextArea, TableCellEditor, Focus] author: aterai pubdate: 2011-06-20T14:39:55+09:00 description: JTableのTableCellEditorとして、JTextAreaとJScrollPaneを使用します。 image:
概要
JTable
のTableCellEditor
として、JTextArea
とJScrollPane
を使用します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
class TextAreaCellEditor extends AbstractCellEditor implements TableCellEditor {
#spanend
private static final String KEY = "Stop-Cell-Editing";
private final JTextArea textArea = new JTextArea();
private final JScrollPane scroll = new JScrollPane(textArea);
#spandel
**サンプルコード [#gf065aec]
#spanend
#spandel
#code{{
#spanend
#spandel
class TextAreaCellEditor extends JTextArea implements TableCellEditor {
#spanend
private final JScrollPane scroll;
public TextAreaCellEditor() {
scroll = new JScrollPane(this);
setLineWrap(true);
KeyStroke enter = KeyStroke.getKeyStroke(
KeyEvent.VK_ENTER, InputEvent.CTRL_MASK);
getInputMap(JComponent.WHEN_FOCUSED).put(enter, new AbstractAction() {
protected TextAreaCellEditor() {
super();
scroll.setBorder(BorderFactory.createEmptyBorder());
// scroll.setViewportBorder(BorderFactory.createEmptyBorder());
#spanadd
#spanend
textArea.setLineWrap(true);
textArea.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));
#spanadd
#spanend
int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
// Java 10: int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx();
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, modifiers);
textArea.getInputMap(JComponent.WHEN_FOCUSED).put(enter, KEY);
textArea.getActionMap().put(KEY, new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
stopCellEditing();
}
});
}
#spanadd
#spanend
@Override public Object getCellEditorValue() {
return getText();
return textArea.getText();
}
#spanadd
#spanend
@Override public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
setFont(table.getFont());
setText((value!=null)?value.toString():"");
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
setCaretPosition(getText().length());
requestFocusInWindow();
}
JTable table, Object value, boolean isSelected, int row, int column) {
// System.out.println("getTableCellEditorComponent");
textArea.setFont(table.getFont());
textArea.setText(Objects.toString(value, ""));
EventQueue.invokeLater(() -> {
textArea.setCaretPosition(textArea.getText().length());
textArea.requestFocusInWindow();
System.out.println("invokeLater: getTableCellEditorComponent");
});
return scroll;
}
@Override public boolean isCellEditable(final EventObject e) {
if(e instanceof MouseEvent) {
return ((MouseEvent)e).getClickCount() >= 2;
#spanadd
#spanend
@Override public boolean isCellEditable(EventObject e) {
if (e instanceof MouseEvent) {
return ((MouseEvent) e).getClickCount() >= 2;
}
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
if(e instanceof KeyEvent) {
KeyEvent ke = (KeyEvent)e;
char kc = ke.getKeyChar();
if(Character.isUnicodeIdentifierStart(kc)) {
setText(getText()+kc);
}
// System.out.println("isCellEditable");
EventQueue.invokeLater(() -> {
if (e instanceof KeyEvent) {
KeyEvent ke = (KeyEvent) e;
char kc = ke.getKeyChar();
if (Character.isUnicodeIdentifierStart(kc)) {
textArea.setText(textArea.getText() + kc);
System.out.println("invokeLater: isCellEditable");
}
}
});
return true;
}
#spandel
//......
#spanend
#spanadd
}
#spanend
View in GitHub: Java, Kotlin解説
- TableCellEditor#isCellEditable
解説
上記のサンプルでは、0
列目にデフォルトのTableCellEditor(JTextField)
、1
列目にJTextArea
を継承したTableCellEditor
を設定しています。
-
TableCellEditor#isCellEditable(...)
- マウスのダブルクリックで編集開始
- TableCellEditor#getTableCellEditorComponent
- JTextAreaに現在表示されているセル文字列をコピーし、戻り値のComponentとして、JScrollPaneを返す
- TableCellEditor#isCellEditable, EventQueue.invokeLater
- キー入力で編集開始した場合、その入力をJTextAreaの文字列末尾に追加
- TableCellEditor#getTableCellEditorComponent, EventQueue.invokeLater
- JTextAreaにフォースを移動し、JTextAreaのキャレットも文字列末尾に移動
-
TableCellEditor#getTableCellEditorComponent(...)
-
JTextArea
に現在表示されているセル文字列をコピーし、戻り値のComponent
としてJScrollPane
を返す
-
-
TableCellEditor#isCellEditable(...)
、EventQueue.invokeLater(...)
- キー入力で編集開始した場合、その入力を
JTextArea
の文字列末尾に追加 - Character#isUnicodeIdentifierStart(char) (Java Platform SE 8)
- キー入力で編集開始した場合、その入力を
-
TableCellEditor#getTableCellEditorComponent(...)
、EventQueue.invokeLater(...)
-
JTextArea
にフォーカスを移動しJTextArea
のキャレットも文字列末尾に移動
-