Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DocumentListener上的JTable筛选器不工作 //注册过滤器 最终TableRowSorter分拣机=新的TableRowSorter(数据库模型); DocumentListener idListener=新建DocumentListener(){ public void changedUpdate(DocumentEvent DocumentEvent){ } 公共作废插入更新(DocumentEvent DocumentEvent){ 字符串searchText=txtReg.getText(); if(searchText.length()=0){ 分拣机设置行过滤器(空); }否则{ sorter.setRowFilter(RowFilter.regexFilter(searchText)); } numberOfRecords.setText(searchTable.getRowCount()+“记录”); } 公共作废移除更新(DocumentEvent DocumentEvent){ } }; txtReg.getDocument().addDocumentListener(idListener);_Java_Swing_Jtable_Jtextfield_Rowfilter - Fatal编程技术网

Java DocumentListener上的JTable筛选器不工作 //注册过滤器 最终TableRowSorter分拣机=新的TableRowSorter(数据库模型); DocumentListener idListener=新建DocumentListener(){ public void changedUpdate(DocumentEvent DocumentEvent){ } 公共作废插入更新(DocumentEvent DocumentEvent){ 字符串searchText=txtReg.getText(); if(searchText.length()=0){ 分拣机设置行过滤器(空); }否则{ sorter.setRowFilter(RowFilter.regexFilter(searchText)); } numberOfRecords.setText(searchTable.getRowCount()+“记录”); } 公共作废移除更新(DocumentEvent DocumentEvent){ } }; txtReg.getDocument().addDocumentListener(idListener);

Java DocumentListener上的JTable筛选器不工作 //注册过滤器 最终TableRowSorter分拣机=新的TableRowSorter(数据库模型); DocumentListener idListener=新建DocumentListener(){ public void changedUpdate(DocumentEvent DocumentEvent){ } 公共作废插入更新(DocumentEvent DocumentEvent){ 字符串searchText=txtReg.getText(); if(searchText.length()=0){ 分拣机设置行过滤器(空); }否则{ sorter.setRowFilter(RowFilter.regexFilter(searchText)); } numberOfRecords.setText(searchTable.getRowCount()+“记录”); } 公共作废移除更新(DocumentEvent DocumentEvent){ } }; txtReg.getDocument().addDocumentListener(idListener);,java,swing,jtable,jtextfield,rowfilter,Java,Swing,Jtable,Jtextfield,Rowfilter,我又在这里问了一些可能很愚蠢的问题…:(我有一个JTable,我想在输入文本字段时过滤掉。在研究了一点之后,我想到了这个,但它不起作用!如果我把过滤器放在侦听器外面,并使用任意字符串作为搜索词,它会很好地工作。我遗漏了什么?谢谢 //Registration filter final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel); Do

我又在这里问了一些可能很愚蠢的问题…:(我有一个JTable,我想在输入文本字段时过滤掉。在研究了一点之后,我想到了这个,但它不起作用!如果我把过滤器放在侦听器外面,并使用任意字符串作为搜索词,它会很好地工作。我遗漏了什么?谢谢

  //Registration filter
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
    DocumentListener idListener = new DocumentListener() {

        public void changedUpdate(DocumentEvent documentEvent) {

        }
        public void insertUpdate(DocumentEvent documentEvent) {
            String searchText = txtReg.getText();
            if (searchText.length() == 0) {
              sorter.setRowFilter(null);
            } else {
              sorter.setRowFilter(RowFilter.regexFilter(searchText));
            }
            numberOfRecords.setText(searchTable.getRowCount() + " records");
        }
        public void removeUpdate(DocumentEvent documentEvent) {

            }


    };
   txtReg.getDocument().addDocumentListener(idListener);
公共类GUI扩展JFrame{
私有静态最终长serialVersionUID=-7968397937566078184L;
私有静态最终JLabel numberOfRecords=新JLabel();
私有静态int numberOfRows;
私有静态DefaultTableModel数据库模型;
公共GUI(DefaultTableModel数据库){
设置DefaultLookandFeelDecorated(true);
setLayout(新的MigLayout());
databaseModel=数据库;
//菜单
JMenuBar menubar=新的JMenuBar();
JMenu文件=新JMenu(“文件”);
JMenuItem update=newjmenuItem(“查找数据库更新”);
JMenuItem设置=新的JMenuItem(“设置”);
JMenuItem退出=新的JMenuItem(“退出”);
menubar.add(文件);
文件。添加(更新);
添加(设置);
文件。添加(退出);
setJMenuBar(菜单栏);
//顶部
JPanel searchSection=新的JPanel();
searchSection.setLayout(新的MigLayout(“宽50mm!”);
最终JTextField txtReg=新的JTextField(10);
JLabel searchID=新的JLabel(“当前注册:”);
JLabel LBL制造商=新JLabel(“制造商”);
JCOMBOX CMBMacturer=新的JCOMBOX();
JLabel lblType=新的JLabel(“类型”);
JComboBox cmbType=新的JComboBox();
//构建主窗口
searchSection.add(searchID);
searchSection.add(txtReg,“span 2”);
searchSection.add(LBL制造商);
搜索部分。添加(CMB制造商,“growx,span 2”);
searchSection.add(lblType);
searchSection.add(cmbType,“growx,span 2”);
//桌子
最终JTable searchTable=新JTable(数据库模型);
//收拾桌子,还得弄清楚这张
整数宽度=0;
对于(int row=0;row
所以我最终启动了它。看起来是个简单的错误。您忘记了表的
设置行排序器

public class GUI extends JFrame {
private static final long serialVersionUID = -7968397937566078184L;
private static final JLabel numberOfRecords = new JLabel();
private static int numberOfRows;
private static DefaultTableModel databaseModel;



public GUI(DefaultTableModel database){
    setDefaultLookAndFeelDecorated(true);
    setLayout(new MigLayout());
    databaseModel = database;
    //Menus
    JMenuBar menubar = new JMenuBar();
    JMenu file = new JMenu("File");
    JMenuItem update = new JMenuItem("Look for database updates");
    JMenuItem settings = new JMenuItem("Settings");
    JMenuItem exit = new JMenuItem("Exit");
    menubar.add(file);
    file.add(update);
    file.add(settings);
    file.add(exit);
    setJMenuBar(menubar);
     //Top section
    JPanel searchSection = new JPanel();
    searchSection.setLayout(new MigLayout("w 50mm!"));
    final JTextField txtReg = new JTextField(10);
    JLabel searchID = new JLabel("Current registration:");
    JLabel lblManufacturer = new JLabel("Manufacturer");
    JComboBox cmbManufacturer = new JComboBox();
    JLabel lblType = new JLabel("Type");
    JComboBox cmbType = new JComboBox();
    //Build main window
    searchSection.add(searchID);
    searchSection.add(txtReg, "span 2");
    searchSection.add(lblManufacturer);
    searchSection.add(cmbManufacturer, "growx, span 2");
    searchSection.add(lblType);
    searchSection.add(cmbType,"growx, span 2");
    //Table
    final JTable searchTable = new JTable(databaseModel);
    //Pack table, still have to figure this one out
    int width = 0;
     for (int row = 0; row < searchTable.getRowCount(); row++) {
         TableCellRenderer renderer = searchTable.getCellRenderer(row, 2);
         Component comp = searchTable.prepareRenderer(renderer, row, 2);
         width = Math.max (comp.getPreferredSize().width, width);
     }

    searchTable.getColumn("Key").setMaxWidth(0);
    searchTable.getColumn("Key").setMinWidth(0);
    searchTable.setRowSelectionAllowed(true);
    searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    searchTable.setAutoCreateRowSorter(true);
    searchTable.getRowSorter().toggleSortOrder(1);
    searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    numberOfRows=searchTable.getRowCount();
    JScrollPane browserSP = new JScrollPane(searchTable);
    browserSP.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
    setTitle("AirBase");
    setSize(1300,700);
    setMinimumSize(new Dimension(1250,650));
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    //TODO Fill manufacturer box

    //Registration filter
    //TODO Fix this!
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
    DocumentListener idListener = new DocumentListener() {

        public void changedUpdate(DocumentEvent documentEvent) {

        }
        public void insertUpdate(DocumentEvent documentEvent) {
            String searchText = txtReg.getText();
            if (searchText.length() == 0) {
              sorter.setRowFilter(null);
            } else {
              sorter.setRowFilter(RowFilter.regexFilter(searchText));
            }
            numberOfRecords.setText(searchTable.getRowCount() + " records");
        }
        public void removeUpdate(DocumentEvent documentEvent) {

            }


    };
   txtReg.getDocument().addDocumentListener(idListener);
    add(searchSection, "w 100%, h 5%, wrap");
    add(browserSP,"w 100%, h 95%, wrap");
    numberOfRecords.setFont(numberOfRecords.getFont().deriveFont(9.0f));
    numberOfRecords.setText(numberOfRows + " RECORDS");
    add(numberOfRecords, "alignx center");
}



}
添加了对我有用的代码。应该对你们两个有用,给你们一个有效的
TableModel
传递到
GUI
。我刚刚编了一个虚拟的

注意事项:

  • 您可能还需要在
    DocumentListener
    中将筛选代码添加到
    removeUpdate
    中,这样当文本被退格时,它仍然会进行筛选

  • searchTable.getColumn(“Key”).setMaxWidth(0);
    使行数据不可见。这是您真正想要的吗

  • 如果希望过滤器不区分大小写,可以使用此选项

    searchTable.setRowSorter(sorter);
    
    “(?i)”
    是不区分大小写的正则表达式“标志”


您所拥有的乍一看很好。您能否提供一个完整的可运行示例,其中包含表的硬编码值,以便我们进行测试。@peeskillet编辑了这个问题,这就是您想要的吗?:(我应该为我的代码感到羞耻吗?hahaKinda,但您缺少表模型的数据。实际
sorter.setRowFilter(RowFilter.regexFilter("(?i)" + searchText));