有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JTable id在动态搜索后重置

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

当我选择一行时,我会在左下角显示它的id号,如上图所示。然后我会把身份证送到某个我需要的地方。但我也有一个动态搜索我的表,我做了一个搜索,如图所示


enter image description here

我过滤搜索那些以“Go”字母开头的电影,它显示了两部电影,它们的资历是正确的,但当我选择一部时,它没有给出正确的id。正如图中所示,我选择了《欢乐时光》电影,它的id是7,但左下角是1,如果我选择Gora电影,它的id是8,但左下角是2。但我希望左下角显示电影的id

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

我的Jdialog的构造函数

public JDialogClass(java.awt.Frame parent, boolean modal, int id) {
    super(parent, modal);
    initComponents();
    this.kullaniciID = id;
    model = (DefaultTableModel) myTable.getModel();
    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

}

动态搜索的密钥释放方法

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)); 

}        

共 (1) 个答案

  1. # 1 楼答案

    myTable.setRowSorter(tr);
    

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

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

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

    因此,上面的语句是不正确的,因为模型索引可能与表行索引不匹配

    您可以直接从表中获取数据:

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

    但是,这可能会导致用户重新组织列(除非您已禁用此功能),并且表视图的列0将不再是id

    因此,更安全的解决方案是使用:

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