Quería configurar mi segunda columna como editor JComboBox usando TableModelListener . También quería cambiar el modelo de ComboBox en la segunda columna según el ComboBox seleccionado en la primera columna. Aquí implementé un Listener que escucha la primera columna.
private class TableScheduleListener implements TableModelListener { //Listening for data changes. @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); } if(column == 1) { for(int i = 0; i < createScheduleView.tblSchedule.getRowCount(); i++) { createScheduleView.tblSchedule.getCellEditor(i, 2); } int col = createScheduleView.tblSchedule.convertColumnIndexToModel(2); if(col == 2 && createScheduleView.tblSchedule.getRowCount() < 7) { DefaultComboBoxModel cbModel = new DefaultComboBoxModel(createScheduleModel.setData().toArray()); createScheduleView.cbBreakStartTime.setModel(cbModel); } } }Pero estoy pensando en cómo puedo configurar JComboBox como editor en mi segunda columna. Después de la configuración, ¿es el modelo? Cualquier ayuda sería apreciada.
ACTUALIZAR
Seguí los consejos de camickr de https://tips4java.wordpress.com/2009/06/28/combo-box-table-editor/ Pero quería anular TableCellEditor de una clase diferente.
private class TableScheduleEditor extends JTable { // Determine editor to be used by row @Override public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel(column); if(modelColumn == 2 && row < 7) { DefaultComboBoxModel model = new DefaultComboBoxModel(createScheduleModel.setData().toArray()); createScheduleView.getCbBreakStartTime().setModel(model); return new DefaultCellEditor(createScheduleView.getCbBreakStartTime()); } else return super.getCellEditor(row, column); }; } Estoy pensando cómo esta clase puede registrarse en mi JTable. Traté de registrar esto en mi constructor this.createScheduleView.tblSchedule.setCellEditor(new TableScheduleEditor()); Pero dice que no se puede convertir a TableCellEditor porque extiende JTable. ¿Algún truco para hacer esto?
También quería cambiar el modelo de ComboBox en la segunda columna según el ComboBox seleccionado en la primera columna
Anule el método getCellEditor(...) de JTable para devolver el editor adecuado.
He aquí un ejemplo básico para empezar:
import java.awt.*; import java.util.List; import java.util.ArrayList; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.table.*; public class TableComboBoxByRow extends JPanel { List<String[]> editorData = new ArrayList<String[]>(3); public TableComboBoxByRow() { setLayout( new BorderLayout() ); // Create the editorData to be used for each row editorData.add( new String[]{ "Red", "Blue", "Green" } ); editorData.add( new String[]{ "Circle", "Square", "Triangle" } ); editorData.add( new String[]{ "Apple", "Orange", "Banana" } ); // Create the table with default data Object[][] data = { {"Color", "Red"}, {"Shape", "Square"}, {"Fruit", "Banana"}, {"Plain", "Text"} }; String[] columnNames = {"Type","Value"}; DefaultTableModel model = new DefaultTableModel(data, columnNames); JTable table = new JTable(model) { // Determine editor to be used by row public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel( column ); if (modelColumn == 1 && row < 3) { JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row)); return new DefaultCellEditor( comboBox1 ); } else return super.getCellEditor(row, column); } }; JScrollPane scrollPane = new JScrollPane( table ); add( scrollPane ); } private static void createAndShowUI() { JFrame frame = new JFrame("Table Combo Box by Row"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add( new TableComboBoxByRow() ); frame.setSize(200, 200); frame.setLocationByPlatform( true ); frame.setVisible( true ); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } }En el ejemplo anterior, el "modelo" cambia según la fila que se está editando.
En su caso, deberá modificar la lógica para devolver el editor en función del valor en la primera columna.