0

这是我在eclipse windowbuilder中构建的计算器的源代码,我试图让两个textFields读取输入并输出一个简单矩形的区域,我可以在框中输入数字但是数字不计算并且我我不知道我可能做错了什么,请批评我的代码并让我知道它为什么不起作用。谢谢

*编辑,我删除并更改了一些东西,现在答案框显示 0.0 而没有别的

    import java.awt.EventQueue;


public class GUI {

private JFrame frame;
private JTextField textField;
private JTextField textField_1;
private JTextField textField_2;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GUI window = new GUI();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public GUI() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 694, 499);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);

    JPanel panel = new JPanel();
    tabbedPane.addTab("New tab", null, panel, null);
    panel.setLayout(null);

    JLabel lblInputBase = new JLabel("Input Base");
    lblInputBase.setBounds(0, 0, 57, 39);
    panel.add(lblInputBase);

    textField = new JTextField();
    textField.setBounds(0, 28, 86, 20);
    panel.add(textField);
    textField.setColumns(10);
    double value = Double.parseDouble(textField.getText());
    JLabel lblInputHeight = new JLabel("Input Height");
    lblInputHeight.setBounds(0, 212, 68, 20);
    panel.add(lblInputHeight);


    textField_1 = new JTextField();
    textField_1.setBounds(0, 230, 86, 20);
    panel.add(textField_1);
    textField_1.setColumns(10);
    double value_1 = Double.parseDouble(textField_1.getText());

    double Area = value*value_1;
    String finalArea = Double.toString(Area);

    JLabel lblArea = new JLabel("Area:");
    lblArea.setBounds(244, 119, 75, 68);
    panel.add(lblArea);

    textField_2 = new JTextField();
    textField_2.setBounds(273, 143, 86, 20);
    panel.add(textField_2);
    textField_2.setColumns(10);
    textField_2.setEditable(false);
    textField_2.setText(finalArea);

    }
}
4

1 回答 1

1

您的代码确实令人困惑,但是我发现了以下一些问题:

double value = Double.parseDouble(textField.getText());

这是在用户有机会查看 gui 之前运行的。textField.getText()将在这里返回一个空字符串,并且 parseDouble 方法在程序运行时总是会抛出一个 NumberFormatException ,因为它不认为空字符串是有效的数字格式。

double Area = Double.parseDouble(value)*Double.parseDouble(value_1);

这里,变量value已经是double,不需要解析,变量value_1也不存在。

在您打算将一个 actionListener 分配给 textField_1 的地方,您将第二个分配给 textField。

总体而言,您的所有计算逻辑似乎都在您的 initialize() 方法中运行,这意味着它只运行一次。您将希望在更新文本字段之一时运行您的数学。

您的字段名称非常混乱。您的 textField 变量名称应该能说明它们的功能,例如areaTextField, baseTextField, heightTextField


这是对您的代码的修改,它似乎可以按照您的预期运行。请注意,添加了一个calculate()由动作侦听器调用的方法,该方法将查找并显示该区域,如果任一输入字段不是有效数字,则显示 NaN(非数字)。除了重命名文本字段变量外,您的所有 GUI 代码都保持原样。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

public class GUI {
    private JFrame frame;
    private JTextField baseTextField;
    private JTextField heightTextField;
    private JTextField areaTextField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI window = new GUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public GUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 694, 499);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);

        JPanel panel = new JPanel();
        tabbedPane.addTab("New tab", null, panel, null);
        panel.setLayout(null);

        JLabel lblInputBase = new JLabel("Input Base");
        lblInputBase.setBounds(0, 0, 57, 39);
        panel.add(lblInputBase);

        baseTextField = new JTextField();
        baseTextField.setBounds(0, 28, 86, 20);
        panel.add(baseTextField);
        baseTextField.setColumns(20);
        baseTextField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                calculate();
            }
        });

        JLabel lblInputHeight = new JLabel("Input Height");
        lblInputHeight.setBounds(0, 212, 68, 20);
        panel.add(lblInputHeight);

        heightTextField = new JTextField();
        heightTextField.setBounds(0, 230, 86, 20);
        panel.add(heightTextField);
        heightTextField.setColumns(20);
        heightTextField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                calculate();
            }
        });

        JLabel lblArea = new JLabel("Area:");
        lblArea.setBounds(244, 119, 75, 68);
        panel.add(lblArea);

        areaTextField = new JTextField();
        areaTextField.setBounds(273, 143, 86, 20);
        panel.add(areaTextField);
        areaTextField.setColumns(20);
        areaTextField.setEditable(false);
    }

    private void calculate() {
        try {
            double base = Double.parseDouble(baseTextField.getText());
            double height = Double.parseDouble(heightTextField.getText());
            double area = base * height;
            areaTextField.setText(String.format("%.4f", area));
        } catch (NumberFormatException e) {
            areaTextField.setText("NaN");
        }
    }
}

请注意,您需要在两个字段之一中按回车键来更新区域字段。这就是触发 JTextField 的 ActionListener 所需要的。

于 2013-07-16T01:03:03.940 回答