如果JTextField的文档为空,如何指定JButton状态[重复]
Posted
技术标签:
【中文标题】如果JTextField的文档为空,如何指定JButton状态[重复]【英文标题】:How to specify JButton state if JTextField's document is empty [duplicate] 【发布时间】:2016-07-14 00:01:58 【问题描述】:所以我今天才开始阅读有关DocumentListeners
和其他一些动作侦听器的信息,但是当任何文本字段为空时,我无法让我的JButton
恢复到setEnabled(false)
状态。这是否与插入符号位置有关,或者当任何文本字段为空时,是否有适当的方法将其恢复为原始状态 setEnabled(false)
。
这是我到目前为止所写的。
public class home extends javax.swing.JPanel
public home()
JPasswordField currentPasswordJPasswordField;
JPasswordField newPasswordJPasswordField;
JPasswordField reTypeNewPasswordJPasswordField;
currentPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton));
newPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton));
reTypeNewPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton));
public static class textFieldListener implements DocumentListener
JButton btn;
public textFieldListener(JButton button)
btn = button;
@Override
public void insertUpdate(DocumentEvent e)
btn.setEnabled(true);
@Override
public void removeUpdate(DocumentEvent e)
btn.setEnabled(true);
@Override
public void changedUpdate(DocumentEvent e)
btn.setEnabled(true);
当我在文本字段中输入内容时,它会按预期启用保存按钮。 但是当我按退格键清除所有文本时,保存按钮不会恢复为 setEnabled(false)
。
我将不胜感激。我刚开始学习这个。我还想知道是否可以将动作侦听器放在单独的 .java 文件中。如果是这样,我如何将侦听器应用于我的主类。
谢谢。
【问题讨论】:
如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。 @AndrewThompson 我会注意这一点。我尽可能简洁地编辑了我的帖子。我想这是最短和最简洁的。谢谢。 您可能会注意到 MCVE 比“Minimal”更多,SSCCE 比“Short”更多。这是我建议您发布代码以满足的其他部分。发布代码,我们可以编译、运行并查看问题。 【参考方案1】:您可以为每个文本字段添加一个 KeyListener,并从匿名内部类中更新按钮。
currentPasswordJPasswordField.addKeyListener(new KeyAdapter()
public void keyReleased(KeyEvent e)
super.keyReleased(e);
if(currentPasswordJPasswordField.getText().length() > 0 &&
newPasswordJPasswordField.getText().length() > 0 &&
reTypeNewPasswordJPasswordField.getText().length() > 0)
btn.setEnabeld(true);
else
btn.setEnabled(false);
);
newPasswordJPasswordField.addKeyListener(new KeyAdapter()
public void keyReleased(KeyEvent e)
super.keyReleased(e);
if(currentPasswordJPasswordField.getText().length() > 0 &&
newPasswordJPasswordField.getText().length() > 0 &&
reTypeNewPasswordJPasswordField.getText().length() > 0)
btn.setEnabeld(true);
else
btn.setEnabled(false);
);
reTypeNewPasswordJPasswordField.addKeyListener(new KeyAdapter()
public void keyReleased(KeyEvent e)
super.keyReleased(e);
if(currentPasswordJPasswordField.getText().length() > 0 &&
newPasswordJPasswordField.getText().length() > 0 &&
reTypeNewPasswordJPasswordField.getText().length() > 0)
btn.setEnabeld(true);
else
btn.setEnabled(false);
);
【讨论】:
我要去试试。我不知道有一个关键的听众。我现在也在阅读docs.oracle.com/javase/tutorial/uiswing/events/api.html 的文档。如果可行,我会添加评论。我很感激。谢谢。 是的,这就是要走的路。 如果我将文本粘贴到字段中或以编程方式更新字段会发生什么?KeyListener
无法处理这些用例【参考方案2】:
您的基本方法是正确的,使用DocumentListener
,但您似乎没有在任何时候检查Document
内容的长度
这是一个非常简单的示例,但是在所有三个字段都包含内容之前,该按钮将不会被启用。
你可以通过检查前两个字段是否匹配来扩展这个想法,但我会留给你
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
public class Test
public static void main(String[] args)
new Test();
public Test()
EventQueue.invokeLater(new Runnable()
@Override
public void run()
try
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
ex.printStackTrace();
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
);
public class TestPane extends JPanel
private JPasswordField currentPasswordJPasswordField;
private JPasswordField newPasswordJPasswordField;
private JPasswordField reTypeNewPasswordJPasswordField;
private List<JTextComponent> requiredFields = new ArrayList<>(25);
private JButton okay;
public TestPane()
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridwidth = GridBagConstraints.REMAINDER;
currentPasswordJPasswordField = makePasswordField();
newPasswordJPasswordField = makePasswordField();
reTypeNewPasswordJPasswordField = makePasswordField();
add(currentPasswordJPasswordField, gbc);
add(newPasswordJPasswordField, gbc);
add(reTypeNewPasswordJPasswordField, gbc);
okay = new JButton("Ok");
add(okay);
updateState();
protected JPasswordField makePasswordField()
JPasswordField field = new JPasswordField(20);
field.getDocument().addDocumentListener(new DocumentHandler());
requiredFields.add(field);
return field;
protected void updateState()
boolean enabled = true;
for (JTextComponent field : requiredFields)
if (field.getDocument().getLength() == 0)
enabled = false;
break;
okay.setEnabled(enabled);
public class DocumentHandler implements DocumentListener
@Override
public void insertUpdate(DocumentEvent e)
updateState();
@Override
public void removeUpdate(DocumentEvent e)
updateState();
@Override
public void changedUpdate(DocumentEvent e)
updateState();
【讨论】:
以上是关于如果JTextField的文档为空,如何指定JButton状态[重复]的主要内容,如果未能解决你的问题,请参考以下文章
通过 JTextField 循环到 getText 并检查是不是为空
使用 DocumentListener 实现检查 JTextField
JAVA中如何判断JTextField的一些问题?求高手解答……谢谢