我有一个扩展javax.swing.JTextField
的文本字段,还有像这样的文档监听器
public class MyTetField extends javax.swing.JTextFiled{
public MyTextField(){
super();
// Document listener to check mandatory functionality
getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
/**
* If the text is changed then this event will be fired.
*/
public void changedUpdate(javax.swing.event.DocumentEvent e) {
}
/**
* If some value is removed then this event is fired.
*/
public void removeUpdate(javax.swing.event.DocumentEvent e) {
}
/**
* If some value is auto set, this event will be called
* @param e The value change event
*/
public void insertUpdate(javax.swing.event.DocumentEvent e) {
if (getText().trim().equals("")){
setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.RED));
}else{
setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.GRAY));
}
}
});
}
}
现在我想要另一个文本字段说MyTextField1
扩展MyTextField
,它应该进行强制性检查,并在检查强制字段后给出DB中的一些信息,如果给出了一些值。我不想在其中编写相同的文档侦听器代码。是否可以扩展我在MyTextField
中添加的文档侦听器,或者我应该选择焦点侦听器?
答案 0 :(得分:3)
JTextField
。大多数情况下,不需要扩展Swing组件。MyTextField
课程中您的听众所做的事情与JFormattedTextField
的内容非常相似。您可能想要考虑使用该类MyTextField
课程,只需添加另一个DocumentListener
进行额外检查。您将保留原始功能,因为超级类将添加自己的DocumentListener
答案 1 :(得分:3)
根据您的描述,我假设您希望在文档更改时使用视觉反馈进行验证,其中确切的验证规则是变量。如果是这样,请将其分解为
一些伪代码
public interface TextPredicate {
public boolean isValid(String text);
}
public class NotEmptyTextPredicate implements TextPredicate {
// imlemented to return true/false for not/empty text
}
public class OnChangeValidator {
private TextPredicate predicate;
private JTextComponent textComponent;
private DocumentListener listener;
public OnChangeValidator(JTextComponent component, TextPredicate predicate) {
// assign and register the listener
this.predicate = ....
...
this.listener = create...
component.getDocument().addDocumentListener(listener);
}
protected void validate() {
decorate(predicate.isValid(textComponent.getText())
}
protected void decorate(boolean valid) {
if (valid) {
// set normal visual properties
} else {
// set error visual properties
}
protected DocumentListener createDocumentListener() {
DocumentListener l = new DocumentListener() {
@Override
public void insertUpdate(...) {
validate();
}
@Override
public void removeUpdate(...) {
validate();
}
};
return l;
}
}