JTable多滤波器设计范例

时间:2009-07-03 12:13:36

标签: java

正如标题所说,我想你是否可以指导我一些文件,或者在这里给我建议,设计(GUI设计)表格主要部分由jtable占用,有几个过滤器。主要目标是避免视觉混乱。

1 个答案:

答案 0 :(得分:4)

我过去实现了一个简单的TableFilterPanel,每个表列有一个JTextField,并且当给定字段中存在文本时执行正则表达式匹配。我通常将其列为垂直标签+文本字段列表(即它相当紧凑)。

我的密钥类名为ColumnSearcher,可以使用RowFilter的内容制作JTextField

protected class ColumnSearcher {
    private final int[] columns;
    private final JTextField textField;

    public ColumnSearcher(int column, JTextField textField) {
        this.columns = new int[1];
        this.textField = textField;

        this.columns[0] = column;
    }

    public JTextField getTextField() {
        return textField;
    }

    public boolean isEmpty() {
        String txt = textField.getText();
        return txt == null || txt.trim().length() == 0;
    }

    /**
     * @return Filter based on the associated text field's value, or null if the text does not compile to a valid
     * Pattern, or the text field is empty / contains whitespace.
     */
    public RowFilter<Object, Object> createFilter() {
        RowFilter<Object, Object> ftr = null;

        if (!isEmpty()) {
            try {
                ftr = new RegexFilter(Pattern.compile(textField.getText(), Pattern.CASE_INSENSITIVE), columns);
            } catch(PatternSyntaxException ex) {
                // Do nothing.
            }
        }

        return ftr;
    }
}

当我想更改过滤器设置时,我会从每个过滤器构建一个“和”过滤器:

protected RowFilter<Object, Object> createRowFilter() {
    RowFilter<Object, Object> ret;
    java.util.List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(columnSearchers.length);

    for (ColumnSearcher cs : columnSearchers) {
        RowFilter<Object, Object> filter = cs.createFilter();
        if (filter != null) {
            filters.add(filter);
        }
    }

    if (filters.isEmpty()) {
        ret = NULL_FILTER;
    } else {
        ret = RowFilter.andFilter(filters);
    }

    return ret;
}

当我希望更新过滤器并让PropertyChangeListener响应并重建我的聚合过滤器时,通常会触发PropertyChangeEvent。然后,如果用户在其中一个文本字段中输入内容,则可以选择触发“rowFilter”PropertyChangeEvent(例如,为每个DocumentListener添加JTextField)。

希望有所帮助。