Java — проблема с фильтрацией на JTable

Ну, ребята, я здесь. За три дня я не смог решить эту проблему.

(Я итальянец, извините за мой английский).

Вскоре. У меня есть панель, на которой есть JTable, показывающий список mp3. Затем еще одна панель с JComboBox (с ее помощью я могу выбрать тип фильтра), JTextField (где я пишу, что я хочу искать/фильтровать) и JButton, которые подтверждают и запускают операцию фильтрации.

Проблема в том, что когда я фильтрую таблицу в первый раз (и фильтрация работает), то, если я изменяю тип фильтра с помощью JComboBox, фильтр, кажется, зависает на первом фильтре, который я применил.

Пример: у меня есть этот JTable со столбцом: «#», «Название», «Исполнитель», «Альбом», «Номер дорожки (в альбоме)», «Жанр», «Год» и «Путь» (под кодом , я перевел название столбца, код итальянский, как и я :) ). Я устанавливаю с помощью JComboBox тип фильтра, например: «Альбом». Я набираю в JTextField то, что хочу, и нажимаю JButton «Поиск/Фильтр» (это Cerca/Filtra). Операция фильтрации/поиска проходит хорошо... НО... теперь, если я изменю фильтр и выберу, например, "Год", операция фильтрации по-прежнему устанавливается на "Альбом". Итак, проблема в том, что операция фильтрации по-прежнему настроена на первый тип фильтрации, который я выбрал.

Я не понимаю, что это проблема установки фильтра или другого. В коде, который я опубликую здесь, есть еще одна незначительная ошибка, например, переменные инициализированы, но не используются, я это знаю. За три дня я внес большое количество правок и у меня нет времени редактировать каждое маленькое "предупреждение".

Слушатель JComboBox:

public class AscoltatoreComboRicerca implements ActionListener{

private JLabel jl2;
private JComboBox jcb;
private JTextField jtf;
private TableRowSorter<MioModelloTabella> sorter;
private JButton jb;
private JTable jt;
private MioModelloTabella mmt;






public AscoltatoreComboRicerca(JTextField jtf, TableRowSorter<MioModelloTabella> sorter, JLabel jl2, JComboBox jcb, JButton jb, JTable jt, MioModelloTabella mmt){
    this.jl2 = jl2;
    this.jcb = jcb;
    this.jtf = jtf;
    this.sorter = sorter;
    this.jb = jb;
    this.jt = jt;
    this.mmt = mmt;



}

public void actionPerformed(ActionEvent e) {

    //jt.getSelectionModel().clearSelection();
    //jt.clearSelection();
    jb.setEnabled(true);
    jcb = (JComboBox)e.getSource();
    String tipo_ricerca = (String)jcb.getSelectedItem();
    System.out.println("!!!!!!!!DENTRO ALL'ASCOLTATORECOMBORICERCA, PER LA JCOMBOBOX, IL TIPO_RICERCA è: " + tipo_ricerca);
    if (tipo_ricerca == "") {
        jl2.setText("Scegli tipo di ricerca");
        jtf.setEditable(false);



    }
    else {
        jl2.setText("Inserisci " + tipo_ricerca + " : ");
        jtf.setEditable(true);

    }

    if (tipo_ricerca == "Artista"){


        //Setto l'ascoltatore dedicato per il bottone.

        jb.addActionListener(new AscoltatoreBottoni(2, jtf, jt, mmt, sorter ));

        /*AscoltatoreBottoni ab = new AscoltatoreBottoni(2, jtf, jt, mmt, sorter );
        jb.addActionListener(ab);*/

        System.out.println("!!!!!!!!DENTRO ALL'ASCOLTATORECOMBORICERCA: SELEZIONATO: ARTISTA");



    }

    if (tipo_ricerca == "Album"){

        jb.addActionListener(new AscoltatoreBottoni(3, jtf, jt, mmt, sorter ));

        /*AscoltatoreBottoni ab = new AscoltatoreBottoni(3, jtf,jt, mmt, sorter);
         jb.addActionListener(ab);*/

        System.out.println("!!!!!!!!DENTRO ALL'ASCOLTATORECOMBORICERCA: SELEZIONATO: ALBUM");


    }

    if (tipo_ricerca == "Genere"){

        jb.addActionListener(new AscoltatoreBottoni(5, jtf, jt, mmt, sorter ));

        /*AscoltatoreBottoni ab = new AscoltatoreBottoni(5, jtf, jt, mmt, sorter);
        jb.addActionListener(ab); */
        System.out.println("!!!!!!!!DENTRO ALL'ASCOLTATORECOMBORICERCA: SELEZIONATO: GENERE");


    }

    if (tipo_ricerca == "Anno"){

        jb.addActionListener(new AscoltatoreBottoni(6, jtf, jt, mmt, sorter ));

        /*AscoltatoreBottoni ab = new AscoltatoreBottoni(6, jtf, jt, mmt, sorter );
        jb.addActionListener(ab); */
        System.out.println("!!!!!!!!DENTRO ALL'ASCOLTATORECOMBORICERCA: SELEZIONATO: ANNO");

    }

}

}

Слушатель JButton: (только важные части кода)

public class AscoltatoreBottoni implements ActionListener{

private ArrayList<Mp3> lista_mp3;
private MioModelloTabella mmt, mmt2;
int col;
private JTextField jtf;
private JTable jt;
private TableRowSorter<TableModel> sorter;

[....not important constructors...]



public AscoltatoreBottoni(int col, JTextField jtf, JTable jt, MioModelloTabella mmt, TableRowSorter<TableModel> sorter){
    this.col = col;
    this.jtf = jtf;
    this.mmt = mmt;
    this.jt = jt;
    this.sorter = sorter;

}
@Override
public void actionPerformed(ActionEvent e) {

    [.....Eventi inutili da farvi vedere perché si riferiscono ad altri bottoni]

    if((e.getActionCommand()=="Cerca/Filtra") || (e.getActionCommand() == "Azzera ricerca/filtro")){

            //jt.getSelectionModel().clearSelection();
            //jt.clearSelection();
            //Per resettare la situazione.
           if (col == 0) { 
            RowFilter<Object, Object> filter = new RowFilter <Object, Object>() {

             public boolean include(Entry entry) {
             Integer tmp = (Integer) entry.getValue(col); //a seconda della scelta dell'utente qui ci va il numero della colonna.

               return tmp.intValue() >0;

             }};
             try {
             TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(mmt);

               jt.setRowSorter(sorter);

                sorter.setRowFilter(filter);
             } catch (NullPointerException a){

                 System.out.println("ERRORE IN ASCOLTATORE BOTTONI");
             }

    }

           else {

                //Prendo la stringa dal jtf.
                String ricerca = jtf.getText();
                TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(mmt);
                sorter.setRowFilter(RowFilter.regexFilter(ricerca, col));                           //Cerca le righe che rispondono al campo ricerca.
                //sorter.setSortKeys(null);
                jt.setRowSorter(sorter);



              }

    }
}

PS.: Кажется, что операторы if в прослушивателе JComboBox работают, потому что печатаются println().

Спасибо за вашу драгоценную помощь.


person iLeW    schedule 20.10.2010    source источник


Ответы (2)


Похоже, проблема в том, что вы добавляете новый ActionListener к кнопке каждый раз, когда значение поля со списком изменяется, но вы не удаляете старый слушатель. Это означает, что каждый раз, когда вы меняете значение поля со списком, количество прослушивателей кнопок увеличивается, и все они будут получать уведомления по щелчку в неопределенном порядке.

Вместо того, чтобы каждый раз добавлять новых слушателей, я бы предложил, чтобы у вас был один слушатель на кнопке, который проверяет поле со списком, чтобы увидеть, какую фильтрацию нужно выполнить. Я бы предложил вам реорганизовать ваш код следующим образом:

Создайте метод, выполняющий фильтрацию по столбцу и фильтру. У вас есть этот код в вашем классе AscoltatoreBottoni.

Добавьте прослушиватель к кнопке, которая вызывает этот метод, передавая текущие значения поля со списком и поля фильтра.

Добавьте еще один слушатель в поле со списком, который делает то же самое.

Это должно делать свое дело.

person Cameron Skinner    schedule 20.10.2010
comment
Я собираюсь попробовать этот вариант, который кажется правильным. Спасибо. - person iLeW; 21.10.2010
comment
Спасибо большое мужик! Я сделал это, я пробую каждые два метода, которые вы мне объяснили. В первый раз удалив слушателя, а затем немного изменив код, как вы мне сказали. 2-й способ работает лучше. Итак, одобрено :) Большое спасибо! - person iLeW; 22.10.2010

Если вы не настроены на собственное закодированное решение, я бы дал http://publicobject.com/glazedlists/ попытка. Это бесплатно, с открытым исходным кодом, стабильно и работает как шарм для меня.

person brian_d    schedule 20.10.2010
comment
Я тоже собирался сказать это. +1 - person I82Much; 20.10.2010
comment
Это здорово, но, к сожалению, я не должен этого делать :( Я должен сделать это для университета, добавив только библиотеку для управления тегами mp3 или воспроизведения mp3. Черт. - person iLeW; 22.10.2010