【问题标题】:Using KeyListener to keep track of what textField was used last?使用 KeyListener 跟踪上次使用的 textField?
【发布时间】:2017-06-16 04:36:14
【问题描述】:

我有一个非常简单的 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));
      }
   }
} 

正如您所见,由于不知道如何设置“if”元素,它还没有完成。

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

【问题讨论】:

    标签: java jpanel jbutton jtextfield


    【解决方案1】:

    永远不要向 JTextField 添加 KeyListener,因为它们是非常低级的侦听器,使用它们会破坏文本组件的正常功能。

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

    为什么不简单地将 ActionListeners 添加到两者。当用户在任一字段上按下回车键时,将调用其自己的 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());
        }
    }
    

    【讨论】:

    • 我真的很想这样做,我可以像那样轻松地完成程序并继续前进,但是如果我使用 KeyListener,我会在结束时的平均值上加 2 分对我来说,这可能是 A 或 B 之间的区别。所以我正在努力做到这一点。我阅读了 KeyListener 的 Java API,但我不确定如何在这种情况下实现它...
    • @AbbeyS 当我将文本粘贴到您的文本字段中时,它会破坏您的代码。也许让你的导师相信你做得更好,应该得到超过 2 分的额外积分,或者你的导师应该找到一份不教授编程的新工作,无论哪种方式
    • @AbbeyS:我再次建议不要使用 KeyListener,但如果您需要使用它,为什么不自己先尝试一下呢?对于一个你没有什么可失去的,对于两个,我们会更好地了解你可能做错了什么。否则问题就会演变成“请为我编写这个 keylistener 的代码”,我敢肯定这不是你的本意。
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多