Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 面积计算器不工作,不确定原因_Java_Eclipse_Swing_Calculator_Windowbuilder - Fatal编程技术网

Java 面积计算器不工作,不确定原因

Java 面积计算器不工作,不确定原因,java,eclipse,swing,calculator,windowbuilder,Java,Eclipse,Swing,Calculator,Windowbuilder,这是我在eclipse windowbuilder中构建的计算器的源代码,我试图让两个文本字段读取输入并输出一个简单矩形的区域,我可以在框中键入数字,但是数字无法计算,我不知道我可能做错了什么,请评论我的代码,让我知道为什么它不工作。多谢各位 *编辑,我已经删除并更改了一些内容,现在答案框显示0.0,没有其他内容 import java.awt.EventQueue; public class GUI { private JFrame frame; private JTextFie

这是我在eclipse windowbuilder中构建的计算器的源代码,我试图让两个文本字段读取输入并输出一个简单矩形的区域,我可以在框中键入数字,但是数字无法计算,我不知道我可能做错了什么,请评论我的代码,让我知道为什么它不工作。多谢各位

*编辑,我已经删除并更改了一些内容,现在答案框显示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);

    }
}

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

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

这是在用户有机会查看gui之前运行的<代码>文本字段.GETTrEXE()/Case>将返回一个空字符串,当程序运行时,PARSEBUTION方法总是会抛出一个NUMFALFATATE异常,因为它不认为空字符串是有效的数字格式。p>
double区域=double.parseDouble(值)*double.parseDouble(值_1)

这里,变量
value
已经是双精度的,不需要解析,并且变量
value\u 1
不存在

当您打算将actionListener分配给textField_1时,您将第二个分配给了textField

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

您的字段名非常混乱。textField变量名称应给出其功能的一些指示,如
区域textField
基本textField
高度textField


这里是对代码的一个修改,它似乎按照您的预期功能运行。请注意,添加了一个
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");
        }
    }
}

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

您的
ActionPerformed
实际上没有任何作用。非常感谢您的帮助,我相信我理解我做错了什么,再次感谢您。