在从 JTextField 读取之前等待键

Wait for key before reading from a JTextField

我有一个程序可以制作一个带有 JTextField 的 JFrame。如何让它等待文本出现在 JTextField 中/按下回车键?

public static void main(String[] args) {
   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   int width = (int) screenSize.getWidth();
   int height = (int) screenSize.getHeight();
JFrame frame = new JFrame();
frame.getContentPane().add(new Text());
JTextField field = new JTextField(10);
frame.add(field, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height-55);
frame.setVisible(true);
   // There is a keylistener here called listener. It was 100 lines. Did not want to copy
frame.addKeyListener(listener);
double x = 0;

x = Double.parseDouble(field.getText());


System.out.println(x);

我要

x = Double.parseDouble(field.getText());

到 运行 仅当有人在 JFrame 的 JTextField 中键入内容时。

  1. 不要使用 KeyListener
  2. 将 DocumentListener 添加到 JTextField 的文档。
  3. 在此侦听器内部检查文档是否为空。
  4. 如果不为空,则更改程序的状态以允许计算,可能通过启用或禁用 JButton 或 Action。

例如:

import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

public class DisbleButton extends JPanel {
   private JTextField field = new JTextField(10);
   private ButtonAction buttonAction = new ButtonAction();
   private JButton button = new JButton(buttonAction);

   public DisbleButton() {
      add(field);
      add(button);
      buttonAction.setEnabled(false);

      field.getDocument().addDocumentListener(new FieldDocListener());
   }

   private class FieldDocListener implements DocumentListener {

      @Override
      public void changedUpdate(DocumentEvent dEvt) {
         testDoc(dEvt);
      }

      @Override
      public void insertUpdate(DocumentEvent dEvt) {
         testDoc(dEvt);
      }

      @Override
      public void removeUpdate(DocumentEvent dEvt) {
         testDoc(dEvt);
      }

      private void testDoc(DocumentEvent dEvt) {
         Document doc = dEvt.getDocument();
         buttonAction.setEnabled(doc.getLength() > 0);
      }

   }

   private class ButtonAction extends AbstractAction {
      public ButtonAction() {
         super("Press Me");
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         // TODO do calculation here!

      }
   }

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

      JFrame frame = new JFrame("DisbleButton");
      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();
         }
      });
   }
}