Java - проблема с фильтрацией на JTable - PullRequest
2 голосов
/ 20 октября 2010

Ну, ребята, вот и я.В течение трех дней я не мог решить эту проблему.

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

Вскоре.У меня есть панель, на которой есть 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 Listener: (Только важные части кода)

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 listener, кажется, работают, потому что println () печатаются.

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

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

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

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

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

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

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

Это должно сработать.

1 голос
/ 20 октября 2010

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

...