Ну, ребята, вот и я.В течение трех дней я не мог решить эту проблему.
(я итальянец, извините за мой английский).
Вскоре.У меня есть панель, на которой есть 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 () печатаются.
Спасибо за вашдрагоценная помощь.