ItemEvent が発生したときに、JTable 内の JComboBox の CellRow を取得するにはどうすればよいですか?
JTable に、 JComboBox と、変更に応答するために JComboBox にアタッチされたItemListener。ただし、ItemListener には、変更された ComboBox の行を取得する機能がありません。 ComboBox が変更されたときに同じ行の別の列を操作するには、行番号が必要です。
問題の理解
指定されたコード例では、変更があったときComboBox で検出された場合、ComboBoxListener は影響を受ける項目を取得します。ただし、JTable 内の対応する行にアクセスする方法は提供されません。
CellRow を取得するためのソリューション
コンボ ボックスをエディタとして使用する場合、TableCellEditor getTableCellEditorComponent() メソッドは行をパラメータとして提供します。回答にリンクされている関連例を参照すると、CellRow を次のように取得できます。
public void itemStateChanged(ItemEvent e) { // Get the table cell editor TableCellEditor editor = table.getCellEditor(); // Get the row of the cell being edited int row = table.convertRowIndexToModel(editor.getTableCellEditorComponent(table, ...)); //... }
Keeping Columns Synchronized
依存列間の同期を維持するには、オーバーライドできます。モデルの getValueAt() メソッドを使用して、同じ行内の関連する値に基づいて値を動的に更新します。たとえば、更新イベントを発生させる前に、モデルの setValueAt() メソッドで「他の列」の値を更新できます。
実装例
次のコードでは、次のソリューションを示します。
import javax.swing.table.DefaultTableModel; //... // Override getValueAt() to keep columns synchronized @Override public Object getValueAt(int row, int col) { if (col == DEPENDENT_COL) { return "C2:" + this.getValueAt(row, ITEM_COL); } else { return super.getValueAt(row, col); } } //... // Attach a new ItemListener combo.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { // Get the table cell editor TableCellEditor editor = table.getCellEditor(); // Get the row and update the other column int row = table.convertRowIndexToModel(editor.getTableCellEditorComponent(table, ...)); model.setValueAt("C2:" + e.getItem(), row, DEPENDENT_COL); } } });
このソリューションは、両方のアプローチを組み合わせて、依存する列を同期し、 CellRow.
以上がItemEvent の後に JTable 内の JComboBox の行番号を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。