Java 检查文本退格问题

Java 检查文本退格问题,java,swing,jbutton,jtextfield,documentfilter,Java,Swing,Jbutton,Jtextfield,Documentfilter,我做了一个按钮被禁用的地方,启用它的唯一方法是在字段中键入文本 这是我的密码: import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swi

我做了一个按钮被禁用的地方,启用它的唯一方法是在字段中键入文本

这是我的密码:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

class checkText extends DocumentFilter {
public void replace(DocumentFilter.FilterBypass fb, int offset, int length,         String text,
    AttributeSet attrs) throws BadLocationException {
    super.replace(fb, offset, length, text, attrs);
    main.enableButton();
   }
  }

public class main extends JFrame {
static JFrame inputFrame = new JFrame();
static JTextField myTextfield = new JTextField(10);
static JButton myButton = new JButton("Test");

public main() {
inputGUI();
}

private static void inputGUI() {
inputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
inputFrame.setTitle("The INPUT");
inputFrame.setLayout(new FlowLayout());
inputFrame.setSize(640, 480);
inputFrame.setVisible(true);
inputFrame.setLocationRelativeTo(null);

inputFrame.add(myButton);

DocumentFilter filter = new checkText();
((AbstractDocument) myTextfield.getDocument()).setDocumentFilter(filter);
inputFrame.add(myTextfield);
myButton.setEnabled(false);
}

public static void enableButton() {
myButton.setEnabled(true);
}

public static void main(String args[]) { new main(); }
}

每当我退格并删除所有文本时。按钮仍处于活动状态。当字段中没有文本时,如何将其禁用?

您的DocumentFilter从不检查文档,也不会检查对文档的筛选器方法有什么影响,因此您不应该对其不起作用感到惊讶。您的应用程序也只覆盖三个DocumentFilter方法中的一个。另外,主类有一个
enableButton()
,但是外部类无法禁用按钮

我自己不会使用DocumentFilter,而是使用DocumentListener,因为您希望在注册文本更改之后而不是之前检查文档,因此使用DocumentFilter只会混淆问题。我只需检查文档中文本的长度,就可以了。要获取文档,请对传递到所有重写方法中的DocumentEvent对象调用
getDocument()
。然后,只需在这个问题上调用
getLength()
。如果大于0,则启用该按钮,否则禁用该按钮

e、 g


你能得到输入的长度吗?如果长度等于零,则禁用it@PeerNet:你可以,但这很复杂。仅在筛选器的方法中检查文档是不够的。您还必须检查super方法对文档的作用。这就是为什么使用文档监听器会更简单。KelPrLo:在将来,请考虑在代码中使用缩进。你的平面代码很难阅读和解析。我注意到你问了几个标题为“Java[检查文本退格问题]”的问题。主标记会自动作为页面标题的前缀,因此不应包含在问题标题中。这就不需要方括号了。所以标题应该是“检查文本退格问题”。谢谢。如果我有更多的代表,我会给你需要的代表。
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;


public class Main2 extends JPanel {
   private JButton testButton = new JButton("Test");
   private JTextField textField = new JTextField(11);

   public Main2() {
      add(testButton);
      add(textField);

      testButton.setEnabled(false);
      textField.getDocument().addDocumentListener(new DocumentListener() {

         @Override
         public void removeUpdate(DocumentEvent e) {
            checkDoc(e);
         }

         @Override
         public void insertUpdate(DocumentEvent e) {
            checkDoc(e);
         }

         @Override
         public void changedUpdate(DocumentEvent e) {
            checkDoc(e);
         }

         private void checkDoc(DocumentEvent e) {
            Document doc = e.getDocument();
            testButton.setEnabled(doc.getLength() > 0);
         }
      });
   }

   private static void createAndShowGui() {
      Main2 mainPanel = new Main2();

      JFrame frame = new JFrame("Main2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}