尝试只允许将数字输入 JTextField 并将非数字设置为 0
Trying to only allow for numbers to be entered into JTextField and non-numbers be set as 0
麻烦各位,这是我的华氏度-摄氏度转换器 class,我似乎无法让我的代码识别以下内容,以确保只有数字输入到文本字段中,如果没有, 设为 0:
try {
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
}
我认为这是因为它在我的 class 中的位置。请查看我的完整 class(我把它放在代码的底部):
public class Temperature implements ActionListener {
private static JTextField fahr;
private static JTextField cels;
private JFrame frame;
private JButton first;
private JButton second;
private double fahrVal;
private Double fahrConv;
private double celsVal;
private double celsConv;
private NumberFormat amountFormat;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Temperature window = new Temperature();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Temperature() {
initialize();
first.addActionListener((ActionListener) this);
second.addActionListener((ActionListener) this);
}
private void initialize() {
amountFormat = NumberFormat.getNumberInstance();
frame = new JFrame("raB eltiT");
frame.setBounds(100, 50, 350, 350);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
first = new JButton("...To Celsius");
first.setBounds(130, 60, 100, 50);
first.setBackground(Color.cyan);
first.setActionCommand("click");
first.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JButton src = (JButton) ae.getSource();
//System.out.println("Button labeled " + src.getText() + " was clicked");
}
});
first.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
cels.setText(String.valueOf(fahrConv));
}
});
frame.getContentPane().add(first);
second = new JButton("...To Fahrenheit");
second.setBounds(130, 230, 100, 50);
second.setBackground(Color.pink);
second.setActionCommand("instead");
frame.getContentPane().add(second);
second.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
fahr.setText(String.valueOf(celsConv));
}
});
// Build the Fahrenheit side
JLabel fLabel = new JLabel("Fahrenheit");
fahr = new JTextField("32");
fahr.setPreferredSize(new Dimension(50,50));
fahr.setHorizontalAlignment(JTextField.CENTER);
JPanel fPanel = new JPanel();
fPanel.setBounds(40, 120,100,100);
fPanel.add(fLabel);
fPanel.add(fahr);
frame.getContentPane().add(fPanel);
JLabel cLabel = new JLabel("Celsius");
cels = new JTextField("0");
cels.setPreferredSize(new Dimension(50,50));
cels.setHorizontalAlignment(JTextField.CENTER);
JPanel cPanel = new JPanel();
cPanel.setBounds(220, 120, 100,100);
cPanel.add(cLabel);
cPanel.add(cels);
frame.getContentPane().add(cPanel);
// Put it all up on the screen
frame.setVisible(true);
try {// if is number
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
}
}
public void actionPerformed(ActionEvent event) {
String fahrText = fahr.getText();
fahrVal = Double.parseDouble(fahrText);
fahrConv = ((fahrVal - 32)*5)/9;
fahrConv = Double.parseDouble(new DecimalFormat("##.#").format(fahrConv));
String celsText = cels.getText();
celsVal = Double.parseDouble(celsText);
celsConv = 32 + (celsVal * 9 / 5);
celsConv = Double.parseDouble(new DecimalFormat("##.#").format(celsConv));
}
}
问题不在于你在做什么什么而是哪里和什么时候 你在做。您正在呼叫
try {// if is number
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
}
在您 创建 GUI 的代码中,这发生在用户有任何机会将数据输入 JTextField 之前,使这段代码无用。更好的解决方案是将此代码放入一个侦听器中,该侦听器会在用户准备好提交数据时做出响应,例如在 ActionListener 的 start 处——然后调用 return :
类似于:
public void actionPerformed(ActionEvent event) {
try {
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
// display a JOptionPane error message so the user knows there's been a problem
return; // so the code below isn't called if input in error
}
String fahrText = fahr.getText();
fahrVal = Double.parseDouble(fahrText);
fahrConv = ((fahrVal - 32)*5)/9;
fahrConv = Double.parseDouble(new DecimalFormat("##.#").format(fahrConv));
String celsText = cels.getText();
celsVal = Double.parseDouble(celsText);
celsConv = 32 + (celsVal * 9 / 5);
celsConv = Double.parseDouble(new DecimalFormat("##.#").format(celsConv));
}
其他选项:
- 使用 JFormattedTextField
- 或者使用 JSpinner
- 或者使用 DocumentListener
其他不相关的问题:
- 不要将 MouseListeners 添加到 JButtons,而是使用 ActionListeners。否则侦听器将无法正常运行。例如,如果按钮已被禁用,MouseListener 仍会响应,而 ActionListener 在这种情况下 正确地 不会响应。
- 避免空布局和绝对定位,因为这会导致僵化的 GUI,难以增强、调试,并且在一个平台上看起来还不错,但在所有其他平台上都很糟糕。
麻烦各位,这是我的华氏度-摄氏度转换器 class,我似乎无法让我的代码识别以下内容,以确保只有数字输入到文本字段中,如果没有, 设为 0:
try {
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
}
我认为这是因为它在我的 class 中的位置。请查看我的完整 class(我把它放在代码的底部):
public class Temperature implements ActionListener {
private static JTextField fahr;
private static JTextField cels;
private JFrame frame;
private JButton first;
private JButton second;
private double fahrVal;
private Double fahrConv;
private double celsVal;
private double celsConv;
private NumberFormat amountFormat;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Temperature window = new Temperature();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Temperature() {
initialize();
first.addActionListener((ActionListener) this);
second.addActionListener((ActionListener) this);
}
private void initialize() {
amountFormat = NumberFormat.getNumberInstance();
frame = new JFrame("raB eltiT");
frame.setBounds(100, 50, 350, 350);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
first = new JButton("...To Celsius");
first.setBounds(130, 60, 100, 50);
first.setBackground(Color.cyan);
first.setActionCommand("click");
first.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JButton src = (JButton) ae.getSource();
//System.out.println("Button labeled " + src.getText() + " was clicked");
}
});
first.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
cels.setText(String.valueOf(fahrConv));
}
});
frame.getContentPane().add(first);
second = new JButton("...To Fahrenheit");
second.setBounds(130, 230, 100, 50);
second.setBackground(Color.pink);
second.setActionCommand("instead");
frame.getContentPane().add(second);
second.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
fahr.setText(String.valueOf(celsConv));
}
});
// Build the Fahrenheit side
JLabel fLabel = new JLabel("Fahrenheit");
fahr = new JTextField("32");
fahr.setPreferredSize(new Dimension(50,50));
fahr.setHorizontalAlignment(JTextField.CENTER);
JPanel fPanel = new JPanel();
fPanel.setBounds(40, 120,100,100);
fPanel.add(fLabel);
fPanel.add(fahr);
frame.getContentPane().add(fPanel);
JLabel cLabel = new JLabel("Celsius");
cels = new JTextField("0");
cels.setPreferredSize(new Dimension(50,50));
cels.setHorizontalAlignment(JTextField.CENTER);
JPanel cPanel = new JPanel();
cPanel.setBounds(220, 120, 100,100);
cPanel.add(cLabel);
cPanel.add(cels);
frame.getContentPane().add(cPanel);
// Put it all up on the screen
frame.setVisible(true);
try {// if is number
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
}
}
public void actionPerformed(ActionEvent event) {
String fahrText = fahr.getText();
fahrVal = Double.parseDouble(fahrText);
fahrConv = ((fahrVal - 32)*5)/9;
fahrConv = Double.parseDouble(new DecimalFormat("##.#").format(fahrConv));
String celsText = cels.getText();
celsVal = Double.parseDouble(celsText);
celsConv = 32 + (celsVal * 9 / 5);
celsConv = Double.parseDouble(new DecimalFormat("##.#").format(celsConv));
}
}
问题不在于你在做什么什么而是哪里和什么时候 你在做。您正在呼叫
try {// if is number
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
}
在您 创建 GUI 的代码中,这发生在用户有任何机会将数据输入 JTextField 之前,使这段代码无用。更好的解决方案是将此代码放入一个侦听器中,该侦听器会在用户准备好提交数据时做出响应,例如在 ActionListener 的 start 处——然后调用 return :
类似于:
public void actionPerformed(ActionEvent event) {
try {
Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
fahr.setText("0");
// display a JOptionPane error message so the user knows there's been a problem
return; // so the code below isn't called if input in error
}
String fahrText = fahr.getText();
fahrVal = Double.parseDouble(fahrText);
fahrConv = ((fahrVal - 32)*5)/9;
fahrConv = Double.parseDouble(new DecimalFormat("##.#").format(fahrConv));
String celsText = cels.getText();
celsVal = Double.parseDouble(celsText);
celsConv = 32 + (celsVal * 9 / 5);
celsConv = Double.parseDouble(new DecimalFormat("##.#").format(celsConv));
}
其他选项:
- 使用 JFormattedTextField
- 或者使用 JSpinner
- 或者使用 DocumentListener
其他不相关的问题:
- 不要将 MouseListeners 添加到 JButtons,而是使用 ActionListeners。否则侦听器将无法正常运行。例如,如果按钮已被禁用,MouseListener 仍会响应,而 ActionListener 在这种情况下 正确地 不会响应。
- 避免空布局和绝对定位,因为这会导致僵化的 GUI,难以增强、调试,并且在一个平台上看起来还不错,但在所有其他平台上都很糟糕。