• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JTable で複数行の編集)

JTableで複数行の編集ができる方法

このQ&Aのポイント
  • JTableで複数行の編集ができる方法を解説します。
  • JTextAreaを使った独自のCellEditorを作成することで、JTableで複数行の編集が可能です。
  • キーボード入力で編集を開始するためには、セルにフォーカスがある状態であることが必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

> セルにフォーカスがある状態で、 TABキーによる遷移のことなら、テーブルのアクションマップに新しいTABアクション(テキストエリアがキーフォーカスを取得する)を登録する必要があります。最初に、既存のアクションも呼び出す必要があるでしょうね。

taro1235
質問者

お礼

_ranco_さん、ご回答ありがとうございます。 教えてもらったことをヒントに、F2キーを押すと編集できるように なりました。 以下のような感じです。 --- ActionMap am = table.getActionMap(); final Action oldStartEditingAction = am.get("startEditing"); AbstractAction startEditingAction = new AbstractAction() {   public void actionPerformed(ActionEvent e) {     oldStartEditingAction.actionPerformed(e);     textArea.requestFocus();   } }; am.put("startEditing", startEditingAction); --- 理想をいうと、F2キーを押さなくても編集状態に なってくれるといいんですけど。 TABキーは、"selectNextColumnCell" アクションを置き換えることに なると思いますが、これはうまくいきませんでした。 それに、TABキーだけじゃなく、矢印キーで遷移した場合も 編集可能になってほしいです。 何か方法はないでしょうか?

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

次のようにすれば、テキストエリアにフォーカスを与えることができます: -------------------------------------------------------------------- import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class TextAreaCellEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {  private JTextArea textArea;  private JScrollPane scroll;  public TextAreaCellEditor() {   textArea = new JTextArea();   scroll = new JScrollPane(textArea);  }  public JTextArea getTextArea(){   return textArea;  }  public Object getCellEditorValue() {   return textArea.getText();  }  public boolean shouldSelectCell(EventObject anEvent) {   return true;  }  public boolean stopCellEditing() {   fireEditingStopped();   return true;  }  public void cancelCellEditing() {   fireEditingCanceled();  }  public Component getTableCellEditorComponent(JTable table, Object value,    boolean isSelected, int row, int column) {   textArea.setText((value != null) ? value.toString() : "");   textArea.setCaretPosition(textArea.getText().length());   return scroll;  }  public Component getTableCellRendererComponent(JTable table,   Object value, boolean isSelected, boolean hasFocus, int row, int column){   textArea.setText((value != null) ? value.toString() : "");   textArea.setCaretPosition(textArea.getText().length());   return scroll;  }  static void focusOnTextArea(JTable table){   InputMap im    = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);   KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);   final Action oldTabAction = table.getActionMap().get(im.get(tab));   Action tabAction = new AbstractAction(){    public void actionPerformed(ActionEvent e){     oldTabAction.actionPerformed(e);     JTable table = (JTable)e.getSource();     int row = table.getSelectedRow();     int column = table.getSelectedColumn();     if (column == 1){ // このセルエディタのカラムだ      table.editCellAt(row, column); // 強制的にエディットモードにする      TextAreaCellEditor tace       = (TextAreaCellEditor)(table.getCellEditor(row, column));      JTextArea ta = tace.getTextArea();      ta.requestFocusInWindow(); // テキストエリアにキーフォーカス     }    }   };   table.getActionMap().put(im.get(tab), tabAction);   // 右矢印キーも使いたい   KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);   im.put(right, im.get(tab));  }  /* test */  public static void main(String[] args){   JFrame frame = new JFrame();   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   Container con = frame.getContentPane();   JTable table = new JTable(20, 3);   table.setRowHeight(70);   JScrollPane jsp = new JScrollPane(table);   con.add(jsp, BorderLayout.CENTER);   TextAreaCellEditor tace = new TextAreaCellEditor();   TableColumn tc = table.getColumn(table.getColumnName(1));   tc.setCellEditor(tace); // for column 1   tc.setCellRenderer(tace);   focusOnTextArea(table);   frame.pack();   frame.setVisible(true);  } }

taro1235
質問者

お礼

ありがとうございます。 「強制的にエディットモードにする」ことができるなんて 知りませんでした。 参考にさせていただきます。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

amのget()に具体的な名前ではなくInputMap.get()の結果をそのまま渡したほうがいいですね。だいたいのストーリーは、次のようになるでしょう: ------------------------------------------------ InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ... KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0); ... final Action oldTabAction = table.getActionMap().get(im.get(tab)); Action tabAction = new AbstractAction(){  public void actionPerformed(ActionEvent e){   oldTabAction.actionPerformed(e);   ...   ...   ...   ...  } } ... table.getActionMap().put(im.get(tab), tabAction); ... KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0); im.put(right, im.get(tab)); ------------------------------------------------

taro1235
質問者

お礼

InputMap.get()の結果をそのまま渡しても、編集可能には なってくれませんでした。 #textArea.requestFocus()だけじゃダメなのかな F2キーが使えるようになったので、今回はこれでよしとします。 ご回答ありがとうございました。

関連するQ&A