使用 JTextField 和 DocumentListener 过滤 JTable 反应迟钝且滞后

问题描述 投票:0回答:1

我有一个在 JTable 组件内保存数据的应用程序。我根据在附加了 DocumentListener 的 JTextField 中输入的文本来过滤表。由于某种原因,该过滤器的响应速度非常慢。每当我在文本字段中输入新字符时,应用程序似乎会冻结一会儿。有什么办法可以改善这个问题,或者也许我毕竟做错了?最初我认为这是因为我附加了几个自定义渲染器,这些渲染器可能会降低性能,但在将它们全部注释掉之后,仍然没有明显的变化,所以我可以排除这种情况。

这是我创建并附加监听器的地方。

private void initListener() {
    this.searchField.getDocument().addDocumentListener(new DocumentListener() {
        public void changedUpdate(DocumentEvent e) {
            String text = searchField.getText();
            if (text.trim().length() == 0) {
                table.getRowSorter().setRowFilter(null);
            } else {
                table.getRowSorter().setRowFilter(RowFilter.regexFilter("(?i)" + text));
            }
            table.repaint();
        }

        public void removeUpdate(DocumentEvent e) {
            String text = searchField.getText();
            if (text.trim().length() == 0) {
                table.getRowSorter().setRowFilter(null);
            } else {
                table.getRowSorter().setRowFilter(RowFilter.regexFilter("(?i)" + text));
            }
        }

        public void insertUpdate(DocumentEvent e) {
            String text = searchField.getText();
            if (text.trim().length() == 0) {
                table.getRowSorter().setRowFilter(null);
            } else {
                table.getRowSorter().setRowFilter(RowFilter.regexFilter("(?i)" + text));
            }
        }
    });

这是我的 Table 类配置

    private void initializeUI() {
    this.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    this.getColumn("INTERVAL").setPreferredWidth(20);
}

private void setCustomRowSorter() {
    this.rowSorter = new TableRowSorter<>(model);
    this.setRowSorter(rowSorter);

}
private void setTableCellRenderers() {
    this.setDefaultRenderer(Object.class, new DefaultTickerTableRenderer());
    this.getColumnModel().getColumn(6).setCellRenderer(new RSICellRenderer());
    this.getColumnModel().getColumn(7).setCellRenderer(new SMACellRenderer());
    this.getColumnModel().getColumn(8).setCellRenderer(new SMACellRenderer());
    this.getColumnModel().getColumn(9).setCellRenderer(new SMACellRenderer());
}
java swing
1个回答
0
投票

尝试在与主 UI 线程不同的线程上执行工作。

例如:

private void initListener() {
    Runnable task = () -> {
        String text = searchField.getText();
        if (text.trim().length() == 0) {
            table.getRowSorter().setRowFilter(null);
        } else {
            table.getRowSorter().setRowFilter(RowFilter.regexFilter("(?i)" + text));
        }
        table.repaint();
    };
    this.searchField.getDocument().addDocumentListener(new DocumentListener() {
        public void changedUpdate(DocumentEvent e) {
            SwingUtilities.invokeLater(task);
        }

        public void removeUpdate(DocumentEvent e) {
            SwingUtilities.invokeLater(task);
        }

        public void insertUpdate(DocumentEvent e) {
            SwingUtilities.invokeLater(task);
        }
    }); 
}
© www.soinside.com 2019 - 2024. All rights reserved.