好吧,我在这里。在三天内,我无法解决这个问题。Java - 在JTable上过滤的问题
(我是意大利人,对不起我的英文)。
很快。我有一个面板上有一个JTable,显示一个MP3列表。然后另一个带有JComboBox的面板(使用它我可以选择过滤器的类型),一个JTextField(我编写我想要搜索/过滤的内容)以及一个确认并启动过滤操作的JButton。
问题是,当我第一次过滤表格(和过滤工作),然后,如果我改变JComboBox的过滤器的类型,过滤器似乎冻结我已应用的第一个过滤器。例如:我有这个JTable,它具有列:“#”,“标题”,“艺术家”,“专辑”,“曲目号(在专辑上)”,“流派”,“年份”和“路径” (在代码下面,我转换了列的名称,代码是意大利语,与我:))。我使用JComboBox设置了过滤器的类型,例如:“Album”。 我在JTextField中输入我想要的,然后单击JButton“Search/Filter”(即Cerca/Filtra)。过滤/搜索操作顺利......但是.. 现在如果我更改过滤器并选择例如“Year”,过滤操作仍然设置为“Album”。 所以问题是,我选择的第一种类型的过滤仍设置筛选操作。
我不明白这是设置过滤器或其他问题。我将在这里发布的代码有一些其他小错误,这些变量inizialized但没有使用,我知道它。三天后,我做了大量的改变,我没有时间去编辑每一个小小的“警告”。
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()被打印。
感谢您的宝贵帮助。
我要试试这个选项,似乎是正确的。现在谢谢你。 – iLeW 2010-10-21 15:49:02
看完你的代码后,这个答案似乎正确+1 – 2010-10-21 18:44:14
非常感谢你的男人!我做到了,我尝试了你向我解释的每两种方法。第一次删除监听器,然后改变一些代码,就像你告诉我的一样。第二种方法效果更好。所以,批准:)非常感谢你! – iLeW 2010-10-22 18:25:40