【问题标题】:JTable id resetting after dynamic search动态搜索后 JTable id 重置
【发布时间】:2020-09-12 05:26:28
【问题描述】:

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

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


我过滤搜索以“Go”字母开头的那些,它显示 2 部电影并且它们的资格是正确的,但是当我选择一个时它没有给出正确的 id。如图所示,我选择 Good Time 电影,它的 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();
}

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

}        

【问题讨论】:

    标签: java swing user-interface jtable row


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2020-10-12
      • 2023-03-16
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多