动态搜索后重置 JTable id

JTable id resetting after dynamic search

我的应用程序中有一个来自 MySQL 数据库的 jtable,如图所示;

当我选择一行时,我会在左下角显示它的 ID 号,如上图所示。然后我会将该 ID 发送到某个地方,所以我需要它。但我也有动态搜索我的 table,我像这张图片一样进行搜索;


我过滤搜索以 'Go' 字母开头的那些,它显示了 2 部电影并且他们的资格是正确的但是当我选择一个时它没有给出正确的 ID。如图所示,我选择 Good Time 电影,它的 ID 是 7 但左下角显示 1,如果我选择 Gora 电影,它的 ID 是 8 但左下角显示 2。但我希望左下角显示电影的 ID。

在我的代码中,我认为这些方法将有助于理解我的错误(DefaultTableModel 模型;在 class 开始时初始化);

我的Jdialog的构造函数;

public JDialogClass(java.awt.Frame parent, boolean modal, int id) {
    super(parent, modal);
    initComponents();
    this.kullaniciID = id;
    model = (DefaultTableModel) myTable.getModel();
    showTable();
}

showTable 方法;

public void showTable(){
    model.setRowCount(0);

    ArrayList<Programlar> programlar = new ArrayList<Programlar>();

    programlar = islemler.programGetir();
    if(programlar != null){
        for(Programlar program:programlar){
            Object[] tabloicerigi = {program.getId(),program.getAd(),program.getTur(),program.getTip(),program.getBolumsayisi(),
                                            program.getUzunluk(),program.getPuan()};
            model.addRow(tabloicerigi);
        }

    }

}

动态搜索方法;

public void dynamicSearch(String arama){

    TableRowSorter<DefaultTableModel> tr = new TableRowSorter<DefaultTableModel>(model);

    myTable.setRowSorter(tr);

    tr.setRowFilter(RowFilter.regexFilter("(?i)" + arama, 1)); // 1 number here means search in 2nd column of table

}

动态搜索的 KeyReleased 方法;

private void searchKeyReleased(java.awt.event.KeyEvent evt) {                                            

    String arama = search.getText();

    dynamicSearch(arama);

}    

和选行法;

private void myTableMouseClicked(java.awt.event.MouseEvent evt) {                                            
    int selectedRow = myTable.getSelectedRow();

    int selectedId = (int) model.getValueAt(selectedRow, 0);
    labelWhichShowsID.setText(String.valueOf(selectedId)); 

}        
myTable.setRowSorter(tr);

您正在对 JTable 中的数据进行排序。

模型中的数据未排序。 JTable 仅在排序视图中显示数据。

int selectedId = (int) model.getValueAt(selectedRow, 0);

所以上面的说法是不正确的,因为模型索引可能与 table 行索引不匹配。

您可以直接从 table:

获取数据
int selectedId = (int) myTable.getValueAt(selectedRow, 0);

但是,这有可能导致用户重新组织了列(除非您禁用了此功能)并且 table 视图的第 0 列将不再是 ID。

所以更安全的解决方案是使用:

int modelRow = myTable.convertRowIndexToModel(selectedRow);
int selectedId = (int) model.getValueAt(modelRow, 0);