Java - 在JTable上过滤的问题

时间:2010-10-20 08:56:15

标签: java swing jtable filtering

好吧,伙计们,我在这里。在三天内我无法解决这个问题。

(我是意大利人,对不起我的英语)。

不久。我有一个面板,其中有一个显示mp3列表的JTable。然后另一个面板带有一个JComboBox(我可以选择过滤器的类型),一个JTextField(我写的是我想要搜索/过滤的内容),以及一个确认并启动过滤操作的JButton。

问题在于,当我第一次过滤表(和过滤工作)时,如果我用JComboBox更改过滤器的类型,过滤器似乎会冻结我应用的第一个过滤器。

示例:我有这个JTable有列:“#”,“标题”,“艺术家”,“专辑”,“曲目编号(在专辑上)”,“流派”,“年份”和“路径”(在代码下面,我已经翻译了列的名称,代码是意大利语,就像我:))。我使用JComboBox设置过滤器类型,例如:“Album”。 我在JTextField中键入我想要的内容,然后单击JButton“Search / Filter”(即Cerca / Filtra)。过滤/搜索操作顺利......但是...... 现在,如果我更改过滤器并选择例如“年”,则过滤操作仍在“相册”上设置。 所以问题是过滤操作仍然设置在我选择的第一种过滤类型上。

我不明白这是设置过滤器或其他的问题。我将在这里发布的代码有一些其他的小错误这些变量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 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。:JComboBox监听器中的if语句似乎有效,因为打印了println()。

感谢您的宝贵帮助。

2 个答案:

答案 0 :(得分:2)

看起来问题是每次组合框值更改时都要向按钮添加一个新的ActionListener,但是你没有删除旧的监听器。这意味着每次更改组合框值时,按钮侦听器的数量都会增加,并且会以未定义的顺序通过单击通知它们。

不是每次都添加新的侦听器,我建议您在按钮上有一个侦听器来检查组合框以查看要执行的过滤类型。我建议您按如下方式重构代码:

创建一个方法,在给定列和过滤器的情况下执行过滤。您已在AscoltatoreBottoni课程中获得此代码。

为调用此方法的按钮添加一个侦听器,传递组合框的当前值和过滤器字段。

将另一个侦听器添加到执行相同操作的组合框中。

这应该可以解决问题。

答案 1 :(得分:1)

如果您没有设置自定义编码解决方案,我会尝试http://publicobject.com/glazedlists/。它是免费的,开源的,稳定的,对我来说就像是一种魅力。