我的文本字段很少。如果用户填写了所有文本字段,如何启用按钮;如果用户删除了某些内容,如何禁用按钮?我正在使用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();
        }
    }


使用ButtonModelDocument而不是JButtonJTextField的优点是,您可以轻松更改具体实现,而不必担心ui组件如何更新,因为它们会模型更改时会自动更新。

10-02 08:08