使用KeyListener跟踪最后使用的textField?

时间:2017-01-30 21:32:37

标签: java jpanel jbutton jtextfield

我有一个非常简单的Java程序,旨在将华氏温度转换为摄氏温度,反之亦然。但是现在我只将它设置为从华氏温度转换为摄氏温度,而我却无法弄清楚如何让它在两个方面都有效。

最后,我希望用户能够键入任一文本字段,并让程序根据最后修改的文本字段知道要使用的公式。我想使用Java中的KeyListener函数,但在阅读完文档之后,我对如何解决这个问题感到非常困惑。我知道我应该将它们添加到textFields,但是它的构造函数让我失望。

到目前为止,这是我的代码,如果有人可以解释如何将其纳入我的主要课程,我真的很感激!

import java.awt.*;
import javax.swing.*;

public class Convert extends JFrame
{
   private JTextField jtfFahr = new JTextField(10);
   private JTextField jtfCels = new JTextField(10);
   private JButton jbConvert = new JButton("Convert");

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

   public Convert()
   {
      setTitle("Convert");
      setSize(400, 125);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(EXIT_ON_CLOSE);

      JPanel jpNorth = new JPanel(new GridLayout(0, 2));
         jpNorth.add(new JLabel("Fahrenheit", JLabel.RIGHT));
         jpNorth.add(jtfFahr);
         jpNorth.add(new JLabel("Celcius", JLabel.RIGHT));
         jpNorth.add(jtfCels);
      add(jpNorth, BorderLayout.NORTH);

      JPanel jpSouth = new JPanel();
         jpSouth.add(jbConvert);
      add(jpSouth, BorderLayout.SOUTH);

      Converter cvt = new Converter(jtfFahr, jtfCels);
      jbConvert.addActionListener(cvt);

      setVisible(true);
   }
}

这里是实际执行操作的类:

import javax.swing.*;
import java.awt.event.*;

public class Converter implements ActionListener
{
   private JTextField jtfDegF;
   private JTextField jtfDegC;

   public Converter(JTextField _jtfDegF, JTextField _jtfDegC)
   {
      jtfDegF = _jtfDegF;
      jtfDegC = _jtfDegC;
   }

   public void actionPerformed(ActionEvent ae)
   {
      if()
      {
         double degF = Double.parseDouble(jtfDegF.getText());
         double degC = (degF - 32) * 5.0 / 9.0;
         jtfDegC.setText(String.format("%.2f", degC));
      }
      else
      {
         double degC = Double.parseDouble(jtfDegC.getText());
         double degF = (degC * 9.0 / 5.0) + 32;
         jtfDegF.setText(String.format("%.2f", degF));
      }
   }
} 

正如您所看到的那样,由于不知道如何构建“如果'元件。

关于如何为此实现addKeyListener的任何简单解释都会很棒!

1 个答案:

答案 0 :(得分:1)

永远不要将KeyListener添加到JTextField,因为这些是非常低级的侦听器,使用它们会破坏文本组件的正常运行。

通常我们建议您收听JTextField的文档,但在您的情况下,会有一个更简单的解决方案:

为什么不简单地向两者添加ActionListeners。当用户在任一字段上按Enter键时,将调用其自己的ActionListener,然后您可以决定要执行的转换。

例如,一个简单的例子,将输入的数字加倍或减半

import javax.swing.*;

@SuppressWarnings("serial")
public class TextFieldListener extends JPanel {
    private JTextField field1 = new JTextField(15);
    private JTextField field2 = new JTextField(15);

    public TextFieldListener() {
        field1.addActionListener(e -> {
            String text1 = field1.getText();
            try {
                int value1 = Integer.parseInt(text1);
                String text2 = String.valueOf(2 * value1);
                field2.setText(text2);
            } catch (NumberFormatException e1) {
                String title = "Number Format Error";
                String message = "Text must be numeric";
                JOptionPane.showMessageDialog(field1, message, title, JOptionPane.ERROR_MESSAGE);
                field1.setText("");
            }
        });
        field2.addActionListener(e -> {
            String text2 = field2.getText();
            try {
                int value2 = Integer.parseInt(text2);
                String text1 = String.valueOf(value2 / 2);
                field1.setText(text1);
            } catch (NumberFormatException e1) {
                String title = "Number Format Error";
                String message = "Text must be numeric";
                JOptionPane.showMessageDialog(field1, message, title, JOptionPane.ERROR_MESSAGE);
                field2.setText("");
            }
        });

        add(field1);
        add(field2);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Field Listener");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TextFieldListener());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}