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