valor que poner obtener hacer editable añadir java swing jtable jcombobox tablecelleditor

java - que - ¿Cómo obtengo el CellRow cuando hay un ItemEvent en el JComboBox dentro de la celda?



poner un combobox en java (1)

Tengo una JTable con una columna que contiene un JComboBox.

Tengo un ItemListener conectado a JComboBox que actúa sobre cualquier cambio.

Sin embargo, ItemListener no tiene un método para obtener la Fila en la que está el ComboBox cambiado.

Necesito el número de fila para actuar sobre otra columna en la misma fila cuando el ComboBox tiene un cambio.

Cualquier ayuda sería apreciada.

Este es mi código corto y conciso. Lo que intento lograr es obtener la fila de tabla del ComboBox cuando el elemento que escucha capta un cambio.

import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.IOException; import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class Example extends JFrame { private static final long serialVersionUID = 1L; public static int maxX, maxY; public static final String[] columnHeads = {"Col 1", "Col 2", "Col 3"}; public static void main(String args[]) throws IOException { Example example = new Example(); } public Example() { //Create Table Model DefaultTableModel model = new DefaultTableModel(); for (int index = 0; index < columnHeads.length; index++) { model.addColumn(columnHeads[index]); } //Create Table JTable table = new JTable(model); JScrollPane scrollPane = new JScrollPane(table); //List for ComboBox String[] list = {"Item1", "Item2", "Item3"}; //Create ComboBox JComboBox itemTypes = attachComboBoxRenderer(table, 2, list); //Attach Item Listener itemTypes.addItemListener(new ComboBoxListener()); ((DefaultTableModel) table.getModel()).insertRow( table.getRowCount(), new Object[]{"C1", "C2", ""}); this.setTitle("Example"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = getContentPane(); //MAIN Panel final JPanel main = new JPanel(); main.setLayout(new GridBagLayout()); main.add(scrollPane); container.add(main); this.pack(); this.setVisible(true); } public static JComboBox attachComboBoxRenderer( JTable table, int column, Object[] values) { JComboBox combo = new JComboBox(values); TableColumn col = table.getColumnModel().getColumn(column); col.setCellRenderer(new ComboBoxRenderer(values)); col.setCellEditor(new DefaultCellEditor(combo)); return combo; } } class ComboBoxListener implements ItemListener { private static final int SELECTED = 1; @Override public void itemStateChanged(ItemEvent e) { // Get the affected item Object item = e.getItem(); if (item.toString() != null && !"".equals(item.toString()) && e.getStateChange() == SELECTED) { System.out.println(item.toString() + " selected"); //How do I get Row in the Table of the ComboBox that was changed? } } } class ComboBoxRenderer extends JComboBox implements TableCellRenderer { private static final long serialVersionUID = 1L; public ComboBoxRenderer(Object[] items) { super(items); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); super.setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } // Select the current value setSelectedItem(value); return this; } }


Parece que está usando un cuadro combinado como editor . Si es así, el método TableCellEditor , getTableCellEditorComponent() , incluye la row como parámetro. Hay un ejemplo relacionado aquí .

Adición: para cambiar un valor en la misma fila que ha editado, simplemente haga que el modelo devuelva el valor correcto para la "otra columna" en función de los valores relacionados en esa fila. Alternativamente, actualice el valor relacionado en el método setValueAt() su modelo antes de setValueAt() la actualización, como se muestra en el ejemplo .

Adición: en función de su ejemplo, el código siguiente anula el método getValueAt() del modelo para mantener la columna dependiente sincronizada con la columna del elemento.

import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.IOException; import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; /** @see http://.com/questions/7350445 */ public class DependentColumn extends JFrame { private static final int DEPENDENT_COL = 1; private static final int ITEM_COL = 2; private static final String[] columnNames = {"Col 1", "Col 2", "Col 3"}; public static void main(String args[]) throws IOException { EventQueue.invokeLater(new Runnable() { @Override public void run() { DependentColumn dc = new DependentColumn(); } }); } public DependentColumn() { this.setTitle("Example"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create Model & Table DefaultTableModel model = new DefaultTableModel(columnNames, 0) { @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); } } }; for (int i = 0; i < 16; i++) { model.addRow(new Object[]{"C1", "C2", "Item1"}); } JTable table = new JTable(model); table.setPreferredScrollableViewportSize(new Dimension(320, 120)); //Create ComboBox String[] items = {"Item1", "Item2", "Item3"}; JComboBox combo = new JComboBox(items); TableColumn col = table.getColumnModel().getColumn(ITEM_COL); col.setCellEditor(new DefaultCellEditor(combo)); combo.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { System.out.println(e.getItem() + " selected"); } } }); this.add(new JScrollPane(table)); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } }