【问题标题】:RowFilter for JTableJTable 的行过滤器
【发布时间】:2018-05-10 16:22:08
【问题描述】:

我正在尝试为我的 JTable 实现 RowFilter,但问题是我的表从数据库中获取数据,而我的表对一列使用 JTextArea 自定义渲染器,我已经实现了 RowFilter,它确实有效。

问题是,当我搜索数据时,表格默认恢复为正常视图,就像没有渲染器时您会看到它一样,我希望在完成搜索后表格应该保持其美观。请帮忙。 这是我的代码:

这是我的渲染器:

class wrap extends JTextArea implements TableCellRenderer {
        wrap() {
            super();
            setLineWrap(true);
            setEditable(false);
            setWrapStyleWord(true);
            setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        }

        @Override
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean bln, boolean bln1, int i, int i1) {
            setText((String) value);
            setForeground(Tab.getForeground());
            setBackground(Tab.getBackground());
            setFont(Tab.getFont());
            return this;
        }

这就是我摆桌子的方式:

public void ViewReports() {
        load l5 = new load();
        l5.setVisible(true);
        l5.j1.setText("Fetching Report.");
        SwingWorker worker1 = new SwingWorker() {
            @Override
            protected Void doInBackground() throws Exception {

                if (con == null) {
                    try {
           Class.forName("com.mysql.jdbc.Driver");
           con = DriverManager.getConnection("Connection Details go here");

                    } catch (Exception ex) {
                 JOptionPane.showMessageDialog(tcom, "Connection error.");
                    }
                }
       try {
 PreparedStatement ps = con.prepareStatement("select S_id as 'ID',c_name as 'Candidate Name',C_num as 'Number',Comments,call_status as 'Call Status', date_format(date1,'%d-%b-%y') as 'Date' from CallRecords order by S_id desc;");
                     rs5 = ps.executeQuery();
                } catch (Exception e) {
                }
                return null;
            }

            @Override
            protected void done() {
             Tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
             Tab.setModel(DbUtils.resultSetToTableModel(rs5));
             Tab.getColumnModel().getColumn(3).setCellRenderer(new wrap());
                    updateRowHeights(3, 300);

                    TableColumn c1 = Tab.getColumnModel().getColumn(0);
                    TableColumn c2 = Tab.getColumnModel().getColumn(1);
                    TableColumn c3 = Tab.getColumnModel().getColumn(2);
                    TableColumn c4 = Tab.getColumnModel().getColumn(3);
                    TableColumn c5 = Tab.getColumnModel().getColumn(4);
                    TableColumn c6 = Tab.getColumnModel().getColumn(5);

                    c1.setPreferredWidth(50);
                    c2.setPreferredWidth(130);
                    c3.setPreferredWidth(120);
                    c4.setPreferredWidth(350);
                    c5.setPreferredWidth(100);
                    c6.setPreferredWidth(100);
                try {
                    rs5.close();
                } catch (SQLException ex) {}
                l5.dispose();
            }
        };
        worker1.execute();
}

这是我的过滤方法:

 private void filter(String filterText){
            TableModel dm =(TableModel) Tab.getModel();
            TableRowSorter<TableModel> tr=new TableRowSorter<>(dm);
            Tab.setRowSorter(tr);
            tr.setRowFilter(RowFilter.regexFilter(filterText));
        }

 private void RecordFilterKeyReleased(java.awt.event.KeyEvent evt) {                                         
         String Text = RecordFilter.getText();
         filter(Text);
    }  

我也使用 DefaultTableModel 而不是 TableModel 但无济于事。任何建议将不胜感激。

【问题讨论】:

    标签: java mysql swing jtable rowfilter


    【解决方案1】:
    Tab.setModel(DbUtils.resultSetToTableModel(rs5));
    

    首先,变量名称不应以大写字符开头。你的一些名字是正确的,有些则不是。保持一致并遵循 Java 约定!

    每当您在 JTable 上重置模型时,都会重置自定义渲染器和编辑器。

    所以你需要在设置模型之后将自定义渲染器添加到表中。

    【讨论】:

    • 所以在TableModel dm =(TableModel) Tab.getModel(); 之后我应该重新运行我设置自定义渲染器广告编辑器的部分。并感谢您对变量名的建议,我将从现在开始处理。如果您还有什么想提出的建议,我将不胜感激。
    • 没有。我说你需要在设置模型之后重置渲染器。更改过滤器不会更改模型。虽然它不会引起问题,但为什么每次更改过滤器时都要重置渲染器?这不是很有效。
    • 如果你能告诉我怎么做,我亲爱的朋友将是完全可能的。我真的很感谢你的帮助。关于如何重置渲染器的小代码 sn-p 将非常有帮助。把我当成菜鸟吧。
    • 没有秘密。从 Sorting and Filtering 的 Swing 教程中的 TableFilterDemo 中的代码开始。只需在将模型添加到表时添加渲染器。一旦您使该代码正常工作,然后找出您的真实代码不工作的原因。我们不是来调试您的代码的。事实上,我们无法调试您的代码,因为我们无权访问您的数据库。所以我们所能做的就是给你建议。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多