【发布时间】:2011-12-13 06:58:21
【问题描述】:
我有 3 个摆动文本字段和一个摆动按钮。当这三个字段都没有空白时,我想要做的是将 button.setEnabled() 从 false 更改为 true。我想这并不难,但我就是找不到办法。 在一个文本字段的键控操作上设置 button.setEnabled(true) 很容易,但我如何检查所有这些操作? 感谢您的回复。
【问题讨论】:
我有 3 个摆动文本字段和一个摆动按钮。当这三个字段都没有空白时,我想要做的是将 button.setEnabled() 从 false 更改为 true。我想这并不难,但我就是找不到办法。 在一个文本字段的键控操作上设置 button.setEnabled(true) 很容易,但我如何检查所有这些操作? 感谢您的回复。
【问题讨论】:
您不想只检查键盘输入,因为您还想考虑复制和粘贴输入和删除(停用 JButton)。我会为所有三个字段的关联文档使用一个 DocumentListener,然后如果所有文档都包含文本,则将按钮设置为启用。
例如,
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class FieldListenerTest {
private static final int FIELD_COUNT = 5;
private static void createAndShowUI() {
JButton button = new JButton("Button");
FieldListener fieldListener = new FieldListener(button);
JPanel mainPanel = new JPanel(new GridLayout(0, 1));
for (int i = 0; i < FIELD_COUNT; i++) {
JTextField field = new JTextField(10);
fieldListener.registerDoc(field.getDocument());
mainPanel.add(field);
}
button.setEnabled(false);
mainPanel.add(button);
JFrame frame = new JFrame("FieldListenerTest");
frame.getContentPane().add(mainPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
class FieldListener implements DocumentListener {
private List<Document> docs = new ArrayList<Document>();
private JButton button;
public FieldListener(JButton button) {
this.button = button;
}
public void registerDoc(Document doc) {
docs.add(doc);
doc.addDocumentListener(this);
}
@Override
public void changedUpdate(DocumentEvent arg0) {
update();
}
@Override
public void insertUpdate(DocumentEvent arg0) {
update();
}
@Override
public void removeUpdate(DocumentEvent arg0) {
update();
}
private void update() {
for (Document doc : docs) {
if (doc.getLength() == 0) {
button.setEnabled(false);
return;
}
}
button.setEnabled(true);
}
}
【讨论】:
我会这样做:
创建一个匿名侦听器,检查字段是否为空白并相应地设置按钮状态(例如):
DocumentListener listener = new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
updateButton();
}
public void insertUpdate(DocumentEvent e) {
updateButton();
}
private void updateButton() {
boolean all_blank = tf1.getText().isEmpty() &&
tf2.getText().isEmpty() &&
tf3.getText().isEmpty();
button.setEnabled(!all_blank);
}
public void removeUpdate(DocumentEvent e) {
updateButton();
}
};
然后将其附加到所有字段:
tf1.getDocument().addDocumentListener(listener);
tf2.getDocument().addDocumentListener(listener);
tf3.getDocument().addDocumentListener(listener);
注意:正如 Eng.Fouad 提到的,KeyListener 不会通过粘贴触发,因此我将其更改为 DocumentListener
【讨论】:
一种简单的方法:无论您将button.setEnabled(true) 放在哪里,都可以放置类似
button.setEnabled(!tf1.getText().isEmpty() && !tf2.getText().isEmpty() && !tf3.getText().isEmpty());
【讨论】:
DocumentListeners,就像你所做的那样。抱歉,我的回答有点太简短了。