Java 组合框未筛选我的JTable

Java 组合框未筛选我的JTable,java,combobox,jtable,Java,Combobox,Jtable,我使用一个组合框过滤掉我的JTable。 JTable由需求、类型、合规性列组成,组合框用于“类型”标题 JTable可以很好地显示数据,但是当我在组合框中选择一个类型时,没有显示任何信息,显示一个空白表 我在下面发布了一个类,它扩展了JPanel并创建了JTable,并且具有使用combobox、defaulttablemodel和TableRowSorter的逻辑 大体上,我只是让jtable和jscrollpane可见 package view; import javax.swing.JP

我使用一个组合框过滤掉我的JTable。 JTable由需求、类型、合规性列组成,组合框用于“类型”标题

JTable可以很好地显示数据,但是当我在组合框中选择一个类型时,没有显示任何信息,显示一个空白表

我在下面发布了一个类,它扩展了JPanel并创建了JTable,并且具有使用combobox、defaulttablemodel和TableRowSorter的逻辑

大体上,我只是让jtable和jscrollpane可见

package view;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class TempPanel extends JPanel {

    //Global Variables
    public JTable table;
    public JScrollPane js;
    DefaultTableModel dm;
    JButton btnDisplay;
    /**
     * Create the panel.
     */
    public TempPanel() {

        initialize();
        createColumns();


        //Manually adding to Jtable
        String rowReq[][] = {{"A", "1", null}, {"B", "2" ,null}, {"C", "2", null}};
        addData(rowReq[0][0], rowReq[0][1], rowReq[0][2]);
        addData(rowReq[1][0], rowReq[1][1], rowReq[1][2]);
        addData(rowReq[2][0], rowReq[2][1], rowReq[2][2]);

    }


    public void addData(String req, String type, String compliance) {
        // TODO Auto-generated method stub
        String [] rowData = {req,type,compliance};
        dm.addRow(rowData);
    }

    //Filter my data
    private void filter(String query)
    {
        TableRowSorter<DefaultTableModel> tr = new TableRowSorter<DefaultTableModel>(dm);
        table.setRowSorter(tr);

        if ( query != "None")
        {
            tr.setRowFilter(RowFilter.regexFilter(query));
        }
        else
        {
            table.setRowSorter(tr);
        }
    }


    private void createColumns() {
        // TODO Auto-generated method stub
        //Get table model

        dm = (DefaultTableModel) table.getModel();
        dm.addColumn("Requirements");
        dm.addColumn("Type");
        dm.addColumn("Compliance");
    }



    public void initialize()
    {

        JComboBox comboBox = new JComboBox();
        comboBox.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent arg0) {
                String query = comboBox.getSelectedItem().toString();
                filter(query);
            }
        });
        comboBox.setModel(new DefaultComboBoxModel(new String[] {"Type1", "Type2", "Type3"}));
        comboBox.setBounds(30, 11, 64, 20);
        add(comboBox);

        table = new JTable(dm);
        table.setBounds(10, 42, 220, 127);

        js = new JScrollPane(table);
        add(js);

        btnDisplay = new JButton("Display");
        btnDisplay.setBounds(307, 10, 89, 23);
        add(btnDisplay);

        js.setVisible(false);
        table.setVisible(false);

        //Manually adding data to jtable

    }
}
包视图;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JComboBox;
导入javax.swing.JTable;
导入javax.swing.RowFilter;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableRowSorter;
导入javax.swing.DefaultComboxModel;
导入javax.swing.JButton;
导入java.awt.event.ItemListener;
导入java.awt.event.ItemEvent;
公共类TempPanel扩展了JPanel{
//全局变量
公共JTable表;
公共JScrollPane js;
模型dm;
JButton btnDisplay;
/**
*创建面板。
*/
公共事务委员会(){
初始化();
createColumns();
//手动添加到Jtable
字符串rowReq[][]={{“A”,“1”,null},{“B”,“2”,null},{“C”,“2”,null};
addData(rowReq[0][0],rowReq[0][1],rowReq[0][2]);
addData(rowReq[1][0]、rowReq[1][1]、rowReq[1][2]);
addData(rowReq[2][0]、rowReq[2][1]、rowReq[2][2]);
}
公共void addData(字符串请求、字符串类型、字符串符合性){
//TODO自动生成的方法存根
字符串[]rowData={req,type,compliance};
dm.addRow(rowData);
}
//过滤我的数据
专用无效筛选器(字符串查询)
{
TableRowSorter tr=新的TableRowSorter(dm);
表.设置行分拣机(tr);
如果(查询!=“无”)
{
tr.setRowFilter(RowFilter.regexFilter(查询));
}
其他的
{
表.设置行分拣机(tr);
}
}
私有void createColumns(){
//TODO自动生成的方法存根
//获取表格模型
dm=(DefaultTableModel)table.getModel();
dm.addColumn(“要求”);
dm.addColumn(“类型”);
dm.addColumn(“合规”);
}
公共无效初始化()
{
JComboBox comboBox=新的JComboBox();
comboBox.addItemListener(新的ItemListener(){
公共无效itemStateChanged(ItemEvent arg0){
字符串查询=comboBox.getSelectedItem().toString();
过滤(查询);
}
});
setModel(新的DefaultComboxModel(新字符串[]{“Type1”、“Type2”、“Type3”}));
组合框.立根(30,11,64,20);
添加(组合框);
表=新JTable(dm);
表.立根(10,42,220,127);
js=新的JScrollPane(表);
添加(js);
btnDisplay=新的JButton(“显示”);
btnDisplay.倒退(307,10,89,23);
添加(btnDisplay);
js.setVisible(false);
表1.setVisible(假);
//手动向jtable添加数据
}
}

regexFilter
方法应该接受列索引数组。如果您不提供任何值,它将使用所有列—我猜您的“需求”或“符合性”列不包含与您的类型匹配的值。此外,您可能根本不需要
regexFilter
—只需使用基本相等筛选器,它将更简单、更快。扩展
RowFilter
类并正确实现
include
方法。我的所有列都是字符串,regexFilter是否使用所有列并不重要,因为我的组合框只包含“Type1”“Type2”“Type3”,我真的应该在已经扩展JPanel的类上扩展RowFilter类吗?为什么要扩展类?您不能直接使用
RowFilter
(除非我遗漏了一些非常明显的东西),您必须扩展它。Regex求值为过滤增加了不必要的开销,过滤本质上是两个数组的比较,没有什么奇特的逻辑。此外,通过扩展它,您可以更好地调试它,并查看实际发生的情况。