2010-10-20 68 views
2

好吧,我在这里。在三天内,我无法解决这个问题。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()被打印。

感谢您的宝贵帮助。

回答

2

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

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

创建一个方法,执行过滤给定一个列和过滤器。您的AscoltatoreBottoni课程中包含此代码。

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

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

这应该做的伎俩。

+0

我要试试这个选项,似乎是正确的。现在谢谢你。 – iLeW 2010-10-21 15:49:02

+0

看完你的代码后,这个答案似乎正确+1 – 2010-10-21 18:44:14

+0

非常感谢你的男人!我做到了,我尝试了你向我解释的每两种方法。第一次删除监听器,然后改变一些代码,就像你告诉我的一样。第二种方法效果更好。所以,批准:)非常感谢你! – iLeW 2010-10-22 18:25:40

1

如果你没有在自定义编码的解决方案集,我想给http://publicobject.com/glazedlists/一试。它是免费的,开源的,稳定的,并为我工作的魅力。

+0

我也会这么说。 +1 – I82Much 2010-10-20 19:46:33

+0

这是伟大的,但unfotunately我不会期望这样做:(我必须为大学只增加库管理MP3标签或播放MP3。该死的做到这一点。 – iLeW 2010-10-22 16:07:16