【问题标题】:Java - Problem with filtering on a JTableJava - 过滤 JTable 的问题
【发布时间】: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


    【解决方案1】:

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

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

    创建一个在给定列和过滤器的情况下执行过滤的方法。你的 AscoltatoreBottoni 类中有这个代码。

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

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

    这应该可以解决问题。

    【讨论】:

    • 我将尝试这个似乎正确的选项。现在谢谢你。
    • 非常感谢你!我做到了,我尝试了你向我解释的每两种方法。第一次删除侦听器,然后像您告诉我的那样更改一些代码。第二种方法效果更好。所以,批准:) 非常感谢!
    【解决方案2】:

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

    【讨论】:

    • 我也想说这个。 +1
    • 这很好,但不幸的是我不应该这样做:(我必须为大学添加仅用于管理 mp3 标签或播放 mp3 的库。该死的。
    猜你喜欢
    • 2012-03-16
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多