2011-10-26 35 views
0

JTableに複数セルの編集機能を提供したい:ダブルクリックは選択されたセルの値を編集する(標準的な動作)。右クリックするとポップアップが開く「選択されたセルを編集する」という項目を含むメニューを表示する。Swing JTableでのマルチセル選択

このメニューエントリにヒットすると、選択した範囲の最後のセルが編集可能になります。他の選択されたセルは選択されたままである。次に、新しい値を書き出し、編集が終了すると(通常はEnterキーを押す)、選択されたすべてのセルがこの値を取得します。

すべてのセルに同じ値型、たとえば整数が含まれているとします。

はここで始めるために、ポップアップダイアログを示したコードです:

table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
table.setCellSelectionEnabled(true); 
table.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mousePressed(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      doPop(e); 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      doPop(e); 
     } 
    } 

    private void doPop(MouseEvent e) { 
     MultiEditPopUp menu = new MultiEditPopUp(tblRanges); 
     menu.show(e.getComponent(), e.getX(), e.getY()); 
    } 
}); 


class MultiEditPopUp extends JPopupMenu { 
    JMenuItem menuItem; 

    MultiEditPopUp(JTable table) { 
     menuItem = new JMenuItem("Edit selected"); 
     menuItem.setAction(new BulkEditAction(table)); 
     add(menuItem); 
    } 
} 

class BulkEditAction extends AbstractAction { 
    private final JTable table; 

    public BulkEditAction(JTable table) { 
     this.table = table; 
    } 

    @Override 
    public void actionPerformed(ActionEvent actionEvent) { 
     // TODO: let the user edit the last cell, and then apply to the others 
    } 
} 

私はそんなことをどのように行うことができますか?

+0

正確に何が問題なのですか?編集した値を受け取ったら、それをすべての選択されたセルに伝播して幸せになれます:-) – kleopatra

+1

コメントのカップル(私が得なかった問題に無関係;-))JSomethingをサブクラス化せず、代わりにJPopupMenu特定の項目を追加するためにサブクラス化する必要はありません)b)マウスコンテナの代わりにsetComponentPopupMenuを意味する最高の抽象概念を常に使用します(これは不完全な機能を提供しますが、 tキーボードでポップアップをカバーする) – kleopatra

+0

問題は、選択を維持しながら、そのセルを編集する方法です。 サブクラス化のご提案ありがとうございます。 – espinchi

答えて

2

まだまだ問題は何かわかりません。基本的なアプローチは、選択したセル

  • 店だろう
  • ユーザー編集それらの一つ
  • 終わりには、編集した値を取ると、以前

を保存されているすべてのセルに設定してみましょう編集のライフサイクルが過度に明確に定義されていないため、「最後に」検出されるのは、わかりにくい部分だけです。いくつかのコードスニペット

public class BulkEditAction extends AbstractAction { 
    JTable table; 
    List selectedCells; 

    public BulkEditAction(JTable table) { 
     this.table = table; 
    } 

    @Override 
    public void actionPerformed(ActionEvent actionEvent) { 

     // store, here rows only, refine for cell selection 
     selectedCells = Arrays.asList(table.getSelectedRows()); 
     final int rowToEdit = // ... 
     final int columnToEdit = // ... 
     table.editCellAt(rowToEdit, columnToEdit); 
     CellEditorListener l = new CellEditorListener() { 

      @Override 
      public void editingStopped(ChangeEvent e) { 
       ((AbstractCellEditor) e.getSource()).removeCellEditorListener(this); 
       propagateEditedValue(rowToEdit, columnToEdit); 

      } 

      @Override 
      public void editingCanceled(ChangeEvent e) { 
       ((AbstractCellEditor) e.getSource()).removeCellEditorListener(this); 
      } 
     }; 
     table.getCellEditor().addCellEditorListener(l); 
    } 

    private void propagateEditedValue(final int row, final int column) { 
     // need to invoke to be sure that the table has updated itself after 
     // editingStopped 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       // foreach selectedCell (with coordinates selectedRow/-column 
       table.setValueAt(table.getValueAt(row, column), selectedRow, selectedColumn); 
      } 
     }); 
    } 
} 
+0

非常に良い解決法、これは魅力のように動作します。 私はユーザーエクスペリエンスの問題を解決しようとしています。そのセルを編集すると「すべて選択」が機能せず、さらに悪いことに、矢印を1つ押すとカーソルが移動し、バルクエディションが実行されます。私が管理していれば、私はこの回答を補うためにポストバックします。 アイデア – espinchi

関連する問題