Сброс идентификатора JTable после динамического c поиска - PullRequest
1 голос
/ 25 мая 2020

У меня есть jtable из базы данных MySQL в моем приложении, как на этом изображении;
enter image description here

Когда я выбираю строку, я показываю ее идентификационный номер слева внизу, как показано на изображении выше. Затем я отправлю этот идентификатор куда-нибудь, чтобы он мне понадобился. Но у меня также есть динамический c поиск моей таблицы, я делаю поиск, как на этом изображении;


enter image description here

Я фильтрую поиск Те, которые начинаются с буквы «Go», показывают 2 фильма, и их квалификация верна, но он не дает правильный идентификатор, когда я выбираю один. Как видно на изображении, я выбираю Good Time mov ie, его идентификатор равен 7, но левый нижний говорит 1, если я выбираю Gora mov ie, его идентификатор равен 8, но левый нижний говорит 2. Но я хочу, чтобы слева внизу было показано. идентификатор mov ie.

В моем коде, я думаю, эти методы будут полезны для понимания моей ошибки (модель DefaultTableModel; инициализируется при запуске класса);

My Конструктор 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);
        }

    }

}

Dynami c Метод поиска;

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 для dynamicSearch;

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 Ответ

0 голосов
/ 25 мая 2020
myTable.setRowSorter(tr);

Вы сортируете данные в JTable.

Данные в модели НЕ сортируются. JTable просто отображает данные в отсортированном виде.

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

Таким образом, приведенное выше утверждение неверно, поскольку индекс модели может не соответствовать индексу строки таблицы.

Вы можете получить данные прямо из таблицы:

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

Однако это может привести к тому, что пользователь мог реорганизовать столбцы (если вы не отключили эту функцию) и столбец 0 представления таблицы больше не будет идентификатором.

Таким образом, более безопасным решением будет использование:

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