- ベストアンサー
JTableで複数行の編集ができる方法
- JTableで複数行の編集ができる方法を解説します。
- JTextAreaを使った独自のCellEditorを作成することで、JTableで複数行の編集が可能です。
- キーボード入力で編集を開始するためには、セルにフォーカスがある状態であることが必要です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> セルにフォーカスがある状態で、 TABキーによる遷移のことなら、テーブルのアクションマップに新しいTABアクション(テキストエリアがキーフォーカスを取得する)を登録する必要があります。最初に、既存のアクションも呼び出す必要があるでしょうね。
その他の回答 (2)
- _ranco_
- ベストアンサー率58% (126/214)
次のようにすれば、テキストエリアにフォーカスを与えることができます: -------------------------------------------------------------------- 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); } }
お礼
ありがとうございます。 「強制的にエディットモードにする」ことができるなんて 知りませんでした。 参考にさせていただきます。
- _ranco_
- ベストアンサー率58% (126/214)
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)); ------------------------------------------------
お礼
InputMap.get()の結果をそのまま渡しても、編集可能には なってくれませんでした。 #textArea.requestFocus()だけじゃダメなのかな F2キーが使えるようになったので、今回はこれでよしとします。 ご回答ありがとうございました。
お礼
_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キーだけじゃなく、矢印キーで遷移した場合も 編集可能になってほしいです。 何か方法はないでしょうか?