TITLE:TableCellEditorをスクロール可能にする

Posted by at 2011-06-20

TableCellEditorをスクロール可能にする

`JTableTableCellEditorとして、JTextAreaJScrollPane`を使用します。

  • &jnlp;
  • &jar;
  • &zip;
ScrollingCellEditor.png

サンプルコード

class TextAreaCellEditor extends JTextArea implements TableCellEditor {
  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() {
      @Override public void actionPerformed(ActionEvent e) {
        stopCellEditing();
      }
    });
  }
  @Override public Object getCellEditorValue() {
    return getText();
  }
  @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();
      }
    });
    return scroll;
  }
  @Override public boolean isCellEditable(final 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);
          }
        }
      }
    });
    return true;
  }
//......
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、0列目にデフォルトの`TableCellEditor(JTextField)、1列目にJTextAreaを継承したTableCellEditor`を設定しています。

  • `TableCellEditor#isCellEditable`
    • マウスのダブルクリックで編集開始
  • `TableCellEditor#getTableCellEditorComponent`
    • `JTextAreaに現在表示されているセル文字列をコピーし、戻り値のComponentとして、JScrollPane`を返す
  • `TableCellEditor#isCellEditable, EventQueue.invokeLater`
    • キー入力で編集開始した場合、その入力を`JTextArea`の文字列末尾に追加
  • `TableCellEditor#getTableCellEditorComponent, EventQueue.invokeLater`
    • `JTextAreaにフォースを移動し、JTextArea`のキャレットも文字列末尾に移動

参考リンク

コメント