una todos todas tabla registros para los limpiar las filas eliminar datos dato como columnas codigo añadir java swing jtable actionlistener selectionmodel

java - todos - cómo eliminar todas las filas en jtable?



eliminar todos los registros de una tabla java (4)

tengo una jtable con listselectionlistener puedo agregar dinámicamente las nuevas filas a mi tabla, cuando selecciono la fila, el contenido de la fila seleccionada aparecerá en el cuadro de texto y puedo editar y eliminar los datos, para mi aplicación guardé la tabla datos en el archivo xml, cuando agregue una nueva fila, que se agregarán a la tabla con éxito. pero cuando selecciono una fila y la actualización significa que la tabla no se actualiza (aquí llamo load table ()). (pero los valores actualizados cambiaron en el archivo xml correctamente) este es mi código de muestra para crear la tabla *

ListSelectionModel selectionModel; JTable table1; model = new DefaultTableModel(); table = new JTable(model); table.setRowHeight(20); selectionModel = table.getSelectionModel(); selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); selectionModel.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { stxtBox.setText(""); ptxtBox.setText(""); ntxtBox.setText(""); if (!e.getValueIsAdjusting()) { model1 = table.getSelectionModel(); int lead = model1.getLeadSelectionIndex(); int columns = table.getColumnCount(); String sip = ""; String sport = ""; String snoq = ""; for (int col = 0; col < columns; col++) { Object o = table.getValueAt(lead, col); if (col == 0) { sip += o.toString(); stxtBox.setText(sip); selectedip = sip; } else if (col == 1) { sport += o.toString(); ptxtBox.setText(sport); selectedport = sport; } else { snoq += o.toString(); ntxtBox.setText(snoq); } selectedreq = snoq; } }table.clearSelection(); } });

cargo el contenido de la tabla como este

int rowCount=0; File file = new File("serverconfig.xml"); if (file.exists()) { System.out.print("in load"); int e = table.getRowCount(); if(e> 0) { while (table.getRowCount() > 0) { ((DefaultTableModel) table.getModel()).removeRow(0); } } //here i will load table content from my xml file (that''s working fine)

el problema es cuando actualizo el contenido de mi tabla llamaré a la función loadtable () cada vez que obtengo este error

java.lang.ArrayIndexOutOfBoundsException: 1 >= 1 at java.util.Vector.elementAt(Unknown Source) at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source) at javax.swing.JTable.getValueAt(Unknown Source) at Testsample$18.valueChanged(Testsample.java:1810) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source) at javax.swing.JTable.tableRowsInserted(Unknown Source) at javax.swing.JTable.tableChanged(Unknown Source) at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source) at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source) at javax.swing.table.DefaultTableModel.insertRow(Unknown Source) at javax.swing.table.DefaultTableModel.addRow(Unknown Source) at javax.swing.table.DefaultTableModel.addRow(Unknown Source) at Testsample.loadtable(Testsample.java:577) at Testsample$10.actionPerformed(Testsample.java:1551) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)


esto hará la tarea

DefaultTableModel dm = (DefaultTableModel)table.getModel(); dm.getDataVector().removeAllElements(); dm.fireTableDataChanged();

para que esto funcione, necesitas crear una tabla como esta

String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; Object[][] data = { {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)}, {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)}, }; JTable jTable = new JTable(); jTable.setModel(new DefaultTableModel(data,columnNames));


por ejemplo

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.table.*; public class RemoveAddRows extends JFrame { private static final long serialVersionUID = 1L; private Object[] columnNames = {"Type", "Company", "Shares", "Price"}; private Object[][] data = { {"Buy", "IBM", new Integer(1000), new Double(80.50)}, {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)}, {"Sell", "Apple", new Integer(3000), new Double(7.35)}, {"Buy", "Nortel", new Integer(4000), new Double(20.00)} }; private JTable table; private DefaultTableModel model; public RemoveAddRows() { model = new DefaultTableModel(data, columnNames) { private static final long serialVersionUID = 1L; @Override public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; table = new JTable(model) { private static final long serialVersionUID = 1L; @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); int firstRow = 0; int lastRow = table.getRowCount() - 1; int width = 0; if (row == lastRow) { ((JComponent) c).setBackground(Color.red); } else if (row == firstRow) { ((JComponent) c).setBackground(Color.blue); } else { ((JComponent) c).setBackground(table.getBackground()); } /*if (!isRowSelected(row)) { String type = (String) getModel().getValueAt(row, 0); c.setBackground("Buy".equals(type) ? Color.GREEN : Color.YELLOW); } if (isRowSelected(row) && isColumnSelected(column)) { ((JComponent) c).setBorder(new LineBorder(Color.red)); }*/ return c; } }; table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane); JButton button1 = new JButton("Remove all rows"); button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (model.getRowCount() > 0) { for (int i = model.getRowCount() - 1; i > -1; i--) { model.removeRow(i); } } System.out.println("model.getRowCount() --->" + model.getRowCount()); } }); JButton button2 = new JButton("Add new rows"); button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)}; model.addRow(data0); Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)}; model.addRow(data1); Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)}; model.addRow(data2); Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)}; model.addRow(data3); System.out.println("model.getRowCount() --->" + model.getRowCount()); } }); JPanel southPanel = new JPanel(); southPanel.add(button1); southPanel.add(button2); add(southPanel, BorderLayout.SOUTH); } public static void main(String[] args) { RemoveAddRows frame = new RemoveAddRows(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }


La vieja historia: si hay api de alto nivel para alcanzar un objetivo, nunca uses el nivel inferior. O tal vez una historia relacionada: lee el doc. Api, una y otra vez :-)

Para DefaultTableModel, la API de alto nivel para eliminar todas las filas es:

model.setRowCount(0);

Editar

Mirando tu stacktrace, el error no es causado por la eliminación, sino por el acceso a una fila recién agregada. Mi (al azar, sin ver más o tu código :-) supongo que sería la lead rowIndex en

Object o = table.getValueAt(lead, col);

deberá verificar si es válido, podría ser negativo (sin ventaja) o aún el anterior (índice antes de agregarlo). Tenga en cuenta que el estado de selección se actualiza como consecuencia de agregar / eliminar datos en el modelo de tabla (así como por el usuario interacción) La regla importante aquí es asegurarse de que los elementos internos de la tabla se actualicen después de los cambios del modelo antes de acceder a cualquier estado en el código del cliente. Puede hacerlo envolviéndolo en invokeLater:

void updateTextBox() { if (selectionModel.getLeadSelectionIndex() >= table.getRowCount() || selectionModel.getLeadSelectionIndex() < 0) return; .... // update text panel here } public void valueChanged(...) { if (e.getValueIsAdjusting()) return; SwingUtilities.invokeLater(new Runnable() { public void run() { updateTextBox(); } })); }


Es muy fácil: solo haz esto:

DefaultTableModel model = (DefaultTableModel)table.getModel(); while(model.getRowCount() > 0){ for(int i = 0 ; i < model.getRowCount();i++){ model.removeRow(i) } }