我有一个非常简单的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的任何简单解释都会很棒!
答案 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());
}
}