Как убрать все строки в jtable?
У меня есть одна jtable с listselectionlistener, я могу динамически добавлять новые строки в мою таблицу, когда я выбираю строку, содержимое выбранной строки будет отображаться в текстовом поле, я могу редактировать и удалять данные, для моего приложения я сохранил таблицу Данные в XML-файл, когда я добавляю новую строку, которая будет успешно добавлена в таблицу. но когда я выбираю строку и обновление означает, что таблица не получает обновления (здесь я вызываю load table()).(но обновленные значения изменились в XML-файле правильно), это мой пример кода для создания таблицы *
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();
}
});
я загружаю содержимое таблицы вот так
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)
проблема в том, что когда я обновляю содержимое таблицы, я буду вызывать функцию loadtable () каждый раз, когда получаю эту ошибку
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)
4 ответа
Например
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);
}
}
Старая история: если есть API высокого уровня для достижения цели, никогда не используйте нижний уровень. Или, может быть, связанная история: прочитайте api doc, снова и снова:-)
Для DefaultTableModel высокоуровневый API для удаления всех строк:
model.setRowCount(0);
редактировать
Глядя на вашу трассировку стека, ошибка вызвана не удалением, а доступом к недавно добавленной строке. Моя (случайная, не видя больше или ваш код:-), предположим, будет rowIndex lead
в
Object o = table.getValueAt(lead, col);
вам нужно будет проверить, является ли он действительным, отрицательным (без опережений) или все еще старым (индекс перед добавлением). Обратите внимание, что состояние выбора обновляется в результате добавления / удаления данных в tableModel (а также пользователем). взаимодействие) Важное правило здесь - убедиться, что внутренние компоненты таблицы обновляются после изменения модели, прежде чем получить доступ к любому состоянию в клиентском коде. Вы можете сделать это, поместив его в 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();
}
}));
}
Это сделает задачу
DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.getDataVector().removeAllElements();
dm.fireTableDataChanged();
чтобы это работало, вам нужно создать такую таблицу
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));
Это очень просто: просто сделайте это:
DefaultTableModel model = (DefaultTableModel)table.getModel();
while(model.getRowCount() > 0){
for(int i = 0 ; i < model.getRowCount();i++){
model.removeRow(i)
}
}