我的文本字段很少。如果用户填写了所有文本字段,如何启用按钮;如果用户删除了某些内容,如何禁用按钮?我正在使用Swing。
最佳答案
由于swing是基于MVC的,因此您可以使用模型对象并监听更改。
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
JTextField textField1 = new JTextField(30);
JTextField textField2 = new JTextField(30);
JTextField textField3 = new JTextField(30);
JButton jButton = new JButton("Button");
ButtonModel model = jButton.getModel();
Document document1 = textField1.getDocument();
Document document2 = textField2.getDocument();
Document document3 = textField3.getDocument();
ButtonEnablement buttonEnablement = new ButtonEnablement(model);
buttonEnablement.addDocument(document1);
buttonEnablement.addDocument(document2);
buttonEnablement.addDocument(document3);
contentPane.add(textField1);
contentPane.add(textField2);
contentPane.add(textField3);
contentPane.add(jButton);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
每当一个
Document
更改时,ButtonEnablement
都会查看所有Document
并启用ButtonModel
。public class ButtonEnablement implements DocumentListener {
private ButtonModel buttonModel;
private List<Document> documents = new ArrayList<Document>();
public ButtonEnablement(ButtonModel buttonModel) {
this.buttonModel = buttonModel;
}
public void addDocument(Document document) {
document.addDocumentListener(this);
this.documents.add(document);
documentChanged();
}
public void documentChanged() {
boolean buttonEnabled = false;
for (Document document : documents) {
if (document.getLength() > 0) {
buttonEnabled = true;
break;
}
}
buttonModel.setEnabled(buttonEnabled);
}
@Override
public void insertUpdate(DocumentEvent e) {
documentChanged();
}
@Override
public void removeUpdate(DocumentEvent e) {
documentChanged();
}
@Override
public void changedUpdate(DocumentEvent e) {
documentChanged();
}
}
使用
ButtonModel
和Document
而不是JButton
和JTextField
的优点是,您可以轻松更改具体实现,而不必担心ui组件如何更新,因为它们会模型更改时会自动更新。