valores valor validar una traer tabla seleccionar seleccionada obtener modificar fila datos como columna celda java swing jtable jcombobox tablecelleditor

java - validar - obtener valores de una fila jtable



Agregar JCombobox en Jtable y obtener esa fila y columna en Swing java (3)

Bueno, es pequeño, pero extraño para mí, pero lo solucioné, pero no creo que sea el adecuado, pero lo resolví. llame. Combo botón Acción realizada Evento y ha llamado Ratón clic de jtable en eso. con null en lugar del evento. Echale un vistazo.

comboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. jTable1MouseClicked(null); } }); private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: try { //evt.getPoint(); System.out.println("row" + jTable1.getSelectedRow()); System.out.println("col" + jTable1.getSelectedColumn()); } catch (Exception e) { e.printStackTrace(); } }

Puede ser que no sea de la manera correcta, pero lo resolví. esta funcionando.

La mejor solución es

jTable1.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { System.out.println("Changed Column"+e.getColumn()); System.out.println("first row"+e.getFirstRow()); } }); }

Tengo One Jtable en el que he agregado JComobox así.

TableColumn sportColumn = jTable1.getColumnModel().getColumn(2); comboBox = new JComboBox(); comboBox.addItem("Snowboarding"); comboBox.addItem("Rowing"); comboBox.addItem("Chasing toddlers"); comboBox.addItem("Speed reading"); comboBox.addItem("Teaching high school"); comboBox.addItem("None"); sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

y agregué un evento de mouse de jtable como este.

private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: try { int row = jTable1.rowAtPoint(evt.getPoint()); int col = jTable1.columnAtPoint(evt.getPoint()); System.out.println("Row" + row + "Column" + col); } catch (Exception e) { e.printStackTrace(); } }

y estoy obteniendo la salida correcta de fila y columna.

pero cuando hago clic en la celda donde agregué Jcombobox, esa vez no está dando una puesta de esa fila y columna. todavía he llamado clickevent de tabla en el evento de clic de cuadro combinado, pero está dando la fila de tiempo 0 e incluso la columna 0 aquí captura de pantalla.

entonces, ¿cómo lo soluciono para poder tener esa fila y columna?


Según lo veo, tienes tres opciones básicas ...

Tú podrías...

Adjunte un CellEditorListener al DefaultCellEditor y supervise la editingStopped eventos editingStopped ...

editor.addCellEditorListener(new CellEditorListener() { @Override public void editingStopped(ChangeEvent e) { System.out.println("Editing stopped"); TableCellEditor editor = (TableCellEditor) e.getSource(); Object value = editor.getCellEditorValue(); System.out.println("Selected value = " + value); } @Override public void editingCanceled(ChangeEvent e) { } });

El problema con esto es que no es posible determinar realmente la celda que se ha editado. Incluso con una referencia a JTable , cuando recibe este evento, la tabla ya no está en modo de edición ... Así que todo lo que sabe es el valor del editor ...

Tú podrías...

Adjunte un TableModelListener al TableModel ...

model.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int type = e.getType(); switch (type) { case TableModelEvent.UPDATE: if (e.getFirstRow() - e.getLastRow() == 0) { TableModel model = (TableModel) e.getSource(); int row = e.getFirstRow(); int col = e.getColumn(); System.out.println("Update " + row + "x" + col + " = " + model.getValueAt(row, col)); } break; } } });

Esto le permitirá saber cuándo ha cambiado el valor de una celda (y un montón de otras cosas, pero esto es lo que nos interesa), lo que no le dirá es por qué cambió.

Este enfoque es bueno, ya que proporciona toda la información que necesita saber para encontrar el valor y la celda.

Tú podrías...

Simplemente anule el método setValueAt TableModel y proporcione algún tipo de notificación de su cuenta ...

Si bien esto es una especie de duplicación de la funcionalidad de TableModelListener , podría idear la información del evento para que brinde información más relevante ya que TableModelEvent cubre una gran cantidad de casos de usuarios ...

Ejemplo

A continuación se muestra un ejemplo tomado TableRenderDemo y modificado para demostrar los dos primeros conceptos

import java.awt.BorderLayout; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import java.awt.Component; import java.awt.Dimension; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; /** * TableRenderDemo is just like TableDemo, except that it explicitly initializes * column sizes and it uses a combo box as an editor for the Sport column. */ public class TableRenderDemo extends JPanel { public TableRenderDemo() { super(new BorderLayout()); JTable table = new JTable(new MyTableModel()); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); table.setFillsViewportHeight(true); //Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); //Set up column sizes. initColumnSizes(table); //Fiddle with the Sport column''s cell editors/renderers. setUpSportColumn(table, table.getColumnModel().getColumn(2)); //Add the scroll pane to this panel. add(scrollPane); } /* * This method picks good column sizes. * If all column heads are wider than the column''s cells'' * contents, then you can just use column.sizeWidthToFit(). */ private void initColumnSizes(JTable table) { MyTableModel model = (MyTableModel) table.getModel(); model.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int type = e.getType(); switch (type) { case TableModelEvent.UPDATE: if (e.getFirstRow() - e.getLastRow() == 0) { TableModel model = (TableModel) e.getSource(); int row = e.getFirstRow(); int col = e.getColumn(); System.out.println("Update " + row + "x" + col + " = " + model.getValueAt(row, col)); } break; } } }); TableColumn column = null; Component comp = null; int headerWidth = 0; int cellWidth = 0; Object[] longValues = model.longValues; TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer(); for (int i = 0; i < 5; i++) { column = table.getColumnModel().getColumn(i); comp = headerRenderer.getTableCellRendererComponent( null, column.getHeaderValue(), false, false, 0, 0); headerWidth = comp.getPreferredSize().width; comp = table.getDefaultRenderer(model.getColumnClass(i)). getTableCellRendererComponent( table, longValues[i], false, false, 0, i); cellWidth = comp.getPreferredSize().width; column.setPreferredWidth(Math.max(headerWidth, cellWidth)); } } public void setUpSportColumn(final JTable table, TableColumn sportColumn) { //Set up the editor for the sport cells. JComboBox comboBox = new JComboBox(); comboBox.addItem("Snowboarding"); comboBox.addItem("Rowing"); comboBox.addItem("Knitting"); comboBox.addItem("Speed reading"); comboBox.addItem("Pool"); comboBox.addItem("None of the above"); TableCellEditor editor = new DefaultCellEditor(comboBox); editor.addCellEditorListener(new CellEditorListener() { @Override public void editingStopped(ChangeEvent e) { System.out.println("Editing stopped"); TableCellEditor editor = (TableCellEditor) e.getSource(); Object value = editor.getCellEditorValue(); System.out.println("Selected value = " + value); } @Override public void editingCanceled(ChangeEvent e) { } }); sportColumn.setCellEditor(editor); //Set up tool tips for the sport cells. DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setToolTipText("Click for combo box"); sportColumn.setCellRenderer(renderer); } class MyTableModel extends AbstractTableModel { private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; private Object[][] data = { {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)}, {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)}, {"Sue", "Black", "Knitting", new Integer(2), new Boolean(false)}, {"Jane", "White", "Speed reading", new Integer(20), new Boolean(true)}, {"Joe", "Brown", "Pool", new Integer(10), new Boolean(false)} }; public final Object[] longValues = {"Jane", "Kathy", "None of the above", new Integer(20), Boolean.TRUE}; @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return data.length; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public Object getValueAt(int row, int col) { return data[row][col]; } /* * JTable uses this method to determine the default renderer/ * editor for each cell. If we didn''t implement this method, * then the last column would contain text ("true"/"false"), * rather than a check box. */ @Override public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * Don''t need to implement this method unless your table''s * editable. */ @Override public boolean isCellEditable(int row, int col) { //Note that the data/cell address is constant, //no matter where the cell appears onscreen. if (col < 2) { return false; } else { return true; } } /* * Don''t need to implement this method unless your table''s * data can change. */ @Override public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row, col); } } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("TableRenderDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. TableRenderDemo newContentPane = new TableRenderDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application''s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }


Usando el código a continuación, puede obtener los valores de las filas y columnas seleccionadas.

table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { try { int rowss = table.rowAtPoint(e.getPoint()); System.out.println("rowss" + rowss); printDebugData(table); } catch (ParseException ex) { Logger.getLogger(ShowEmployee.class.getName()).log(Level.SEVERE, null, ex); } } private void printDebugData(JTable jTable1) throws ParseException { String selectedData = null; int numRows = jTable1.getRowCount(); int numCols = jTable1.getColumnCount(); int[] selectedRow = jTable1.getSelectedRows(); int[] selectedColumns = jTable1.getSelectedColumns(); javax.swing.table.TableModel model = jTable1.getModel(); for (int i = 0; i < selectedRow.length; i++) { for (int j = 0; j < selectedColumns.length; j++) { selectedData = (String) jTable1.getValueAt(selectedRow[i], selectedColumns[j]); } System.out.println("Selected: " + selectedData); } } }); }

consulte con mouselistner con su jtbale.

ACTUALIZACIÓN: agregue esta dos líneas antes de invocar printdebugdata ().

int rowss = table.rowAtPoint(e.getPoint()); System.out.println("rowss" + rowss);

Conseguí que el número de fila verificara mi salida.

SALIDA:

rowss0 Selected: Smith rowss0 Selected: Smith rowss1 Selected: Snowboarding rowss1 Selected: Rowing rowss1 Selected: Rowing rowss1 Selected: Rowing rowss2 Selected: Snowboarding rowss2 Selected: Snowboarding rowss2 Selected: Snowboarding rowss2 Selected: Snowboarding

Gracias..