gpt4 book ai didi

Java - 在 JTable 上过滤的问题

转载 作者:行者123 更新时间:2023-12-04 06:43:22 28 4
gpt4 key购买 nike

伙计们,我来了。在三天内我无法解决这个问题。

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

不久。我有一个面板,上面有一个显示 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 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() 已打印。

感谢您的宝贵帮助。

最佳答案

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

与其每次都添加新的监听器,我建议您在按钮上设置一个监听器,用于检查组合框以查看要执行的过滤类型。我建议你重构你的代码如下:

创建一个在给定列和过滤器的情况下执行过滤的方法。您在 AscoltatoreBottoni 中有此代码类(class)。

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

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

这应该够了吧。

关于Java - 在 JTable 上过滤的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3976172/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com