Я новичок в Java, особенно в таблицах, и у меня возникают проблемы с одной конкретной задачей.
У меня есть JTable, в котором используется настраиваемая модель таблицы, расширяющая DefaultTableModel, и я прикрепил к таблице TableRowSorter. В приведенном ниже примере приложения есть две кнопки: одна загружает строки в таблицу, а другая удаляет все выбранные строки из таблицы.
По какой-то причине, если вы выберете последнюю строку в таблице вместе с любой другой строкой, когда вы нажмете кнопку «Удалить», она удалит все выбранные строки, кроме последней. Вы можете удалить любую другую комбинацию строк, и она отлично работает.
Более того, если вы сначала щелкните заголовок столбца для сортировки строк (даже если порядок строк не изменится), он будет работать правильно. Если я добавлю строку для явной сортировки строк в таблице после ее загрузки, проблема «исчезнет», но я хотел бы знать, почему то, что я делаю, неправильно.
Чтобы увидеть поведение, нажмите кнопку «Загрузить», чтобы заполнить таблицу, выберите все строки в таблице, затем нажмите кнопку «Удалить». Он удалит все строки, кроме последней.
Как показывает вызов println, первая итерация цикла уменьшает количество выбранных строк на два. Это поведение согласуется независимо от того, сколько строк у вас есть в таблице, но только если вы выбрали последнюю строку в таблице.
Я использую версию Java 1.6.0_16. Есть идеи относительно того, что я делаю неправильно?
Спасибо,
Джо
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.util.Arrays;
public class TableTest
extends JFrame
{
private JTable widgetTable;
private WidgetTableModel widgetTableModel;
public static void main(String[] args)
{
TableTest frame = new TableTest();
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public TableTest()
{
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
EventQueue.invokeLater(new Runnable() { public void run() { createUI(); } });
}
private void createUI()
{
this.setLayout(new BorderLayout());
JButton loadButton = new JButton("Load");
loadButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loadPerformed();
}
});
this.add(loadButton, BorderLayout.NORTH);
widgetTableModel = new WidgetTableModel();
widgetTable = new JTable(widgetTableModel);
widgetTable.setRowSorter(new TableRowSorter<WidgetTableModel>(widgetTableModel));
this.add(new JScrollPane(widgetTable), BorderLayout.CENTER);
JButton removeButton = new JButton("Remove");
removeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removePerformed();
}
});
this.add(removeButton, BorderLayout.SOUTH);
}
private void loadPerformed()
{
widgetTableModel.addRow(new Object[] {"Widget 1"});
widgetTableModel.addRow(new Object[] {"Widget 2"});
widgetTableModel.addRow(new Object[] {"Widget 3"});
widgetTableModel.addRow(new Object[] {"Widget 4"});
widgetTableModel.addRow(new Object[] {"Widget 5"});
}
private void removePerformed()
{
int selectedRow = widgetTable.getSelectedRow();
while (selectedRow >= 0) {
System.out.println("selectedRowCount=" + widgetTable.getSelectedRowCount());
int modelRow = widgetTable.convertRowIndexToModel(selectedRow);
widgetTableModel.removeRow(modelRow);
selectedRow = widgetTable.getSelectedRow();
}
}
}
class WidgetTableModel
extends DefaultTableModel
{
public WidgetTableModel()
{
this.addColumn("Column 1");
}
}