【发布时间】:2011-04-27 22:21:25
【问题描述】:
好吧,伙计们,我来了。三天之内我无法解决这个问题。
(我是意大利人,对不起我的英语)。
很快。我有一个面板,上面有一个显示 mp3 列表的 JTable。然后是另一个面板,其中有一个 JComboBox(我可以使用它选择过滤器的类型)、一个 JTextField(我在其中编写我想要搜索/过滤的内容)和一个确认并启动过滤操作的 JButton。
问题是,当我第一次过滤表格(并且过滤工作)时,如果我使用 JComboBox 更改过滤器类型,过滤器似乎在我应用的第一个过滤器上冻结。
示例:我的 JTable 包含以下列:“#”、“Title”、“Artist”、“Album”、“Track Number (on Album)”、“Genre”、“Year”和“Path”(在代码下方,我已经翻译了列的名称,代码是意大利语,就像我一样:) )。我使用 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.:JComboBox 监听器中的 if 语句似乎可以工作,因为 println() 已打印。
感谢您的宝贵帮助。
【问题讨论】:
标签: java swing jtable filtering