私はJavaにやや慣れておらず、特にテーブルに慣れていません。特定の1つのタスクで少し問題が発生しています。
DefaultTableModelを拡張するカスタムテーブルモデルを使用するJTableがあり、TableRowSorterをテーブルにアタッチしました。以下のサンプルアプリケーションには2つのボタンがあります。1つは行をテーブルにロードし、もう1つは選択したすべての行をテーブルから削除します。
何らかの理由で、テーブルの最後の行を他の行と一緒に選択した場合、[削除]ボタンをクリックすると、最後の行を除くすべての選択した行が削除されます。他の行の組み合わせは削除でき、正常に機能します。
さらに、最初に列ヘッダーをクリックして行を並べ替えると(行の順序が変更されていない場合でも)、正しく機能します。ロード後にテーブル内の行を明示的に並べ替える行を追加すると、問題は「解消」されますが、私が行っていることが正しくない理由を知りたいのです。
動作を確認するには、[ロード]ボタンをクリックしてテーブルにデータを入力し、テーブル内のすべての行を選択してから、[削除]ボタンをクリックします。最後の行を除くすべての行が削除されます。
printlnの呼び出しが示すように、ループの最初の反復により、選択した行数が2つ減ります。この動作は、テーブルに行がいくつあっても一貫していますが、テーブルの最後の行を選択した場合に限ります。
私は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");
}
}