una - como obtener los valores de un jtable en java
filas no eliminadas de JTable (2)
En mi JTable, todas mis casillas de verificación están en la columna 3. Después de hacer clic en un botón, se eliminarán las filas que están marcadas.
Pero, sin embargo, después de implementar las funciones en mi onclick. No elimina las filas.
El método para el oyente de botones
class DeleteBtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
for(int row = 0; row < table.getRowCount(); ++row) {
if((Boolean) table.getValueAt(row, 3) == true) {
myTableModel.removeRow(row);
table.revalidate();
table.repaint();
}
}
}
}
y esto es lo que está en mi clase AbstractTableModel
@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel {
private final boolean DEBUG = true;
private String[] columnNames = {"Name",
"Age",
"Salary",
"Delete"};
private Object[][] data = {
{"Kathy", "20",new Integer(5), new Boolean(false)},
{"John", "35", new Integer(3), new Boolean(false)},
{"Sue", "20", new Integer(2), new Boolean(false)},
{"Jane", "12", new Integer(20), new Boolean(false)},
{"Mary", "42", new Integer(10), new Boolean(false)}
};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
@SuppressWarnings("unchecked")
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value);
}
data[row][col] = value;
fireTableCellUpdated(row, col);
}
public void removeRow(int row) {
fireTableRowsDeleted(row, row);
}
}
¿Puedes probar con DefaultTableModel
que funciona perfectamente? Anule otros métodos de JTable
si es necesario.
Código de muestra:
DefaultTableModel model = new DefaultTableModel(data, columnNames);
final JTable table = new JTable(model) {
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 2:
return Integer.class;
case 3:
return Boolean.class;
default:
return String.class;
}
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
};
Para eliminar la llamada de fila
((DefaultTableModel) table.getModel()).removeRow(row);
Debe eliminar la fila de los datos reales en su modelo (es decir, los datos de la matriz). fireTableRowsDeleted
no es suficiente. Eso solo actualiza tus cosas. Sin embargo, ten en cuenta que estás usando una matriz. Por lo tanto, deberá avanzar los índices de fila de acuerdo con los datos. Es mejor utilizar una lista para una manipulación más fácil. También tenga en cuenta que está tratando de eliminar filas "concurrentemente" en el ciclo. Entonces, si elimina una fila, también necesita disminuir la fila en el ciclo.
También como mencionó @AndrewThompson, solo usa un DefaultTableModel
. No veo nada especial acerca de su modelo que justifique la necesidad de un modelo personalizado.
Aquí hay un ejemplo con DefaultTableModel
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class TestTable {
private DefaultTableModel myTableModel = getModel();
private JTable table = new JTable(myTableModel);
public TestTable() {
JButton button = new JButton("Remove All");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
for(int row = 0; row < table.getRowCount(); ++row) {
if((Boolean) table.getValueAt(row, 3) == true) {
System.out.println("true");
myTableModel.removeRow(row);
row--;
}
}
}
});
JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.add(button, BorderLayout.PAGE_END);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private DefaultTableModel getModel() {
String[] columnNames = {"Name",
"Age",
"Salary",
"Delete"};
Object[][] data = {
{"Kathy", "20",new Integer(5), new Boolean(false)},
{"John", "35", new Integer(3), new Boolean(false)},
{"Sue", "20", new Integer(2), new Boolean(false)},
{"Jane", "12", new Integer(20), new Boolean(false)},
{"Mary", "42", new Integer(10), new Boolean(false)}
};
return new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int col) {
switch(col) {
case 0:
case 1: return String.class;
case 2: return Integer.class;
case 3: return Boolean.class;
default: return Object.class;
}
}
};
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new TestTable();
}
});
}
}