Калькулятор площади не работает и не уверен, почему

Это исходный код моего калькулятора, который я создаю в Eclipse WindowBbuilder. Я пытаюсь заставить два 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);

    }
}

1 ответ

Ваш код действительно сбивает с толку, но вот некоторые проблемы, которые я обнаружил:

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

Это выполняется до того, как пользователь сможет даже взглянуть на графический интерфейс. textField.getText() здесь будет возвращаться пустая строка, а метод parseDouble всегда будет выдавать исключение NumberFormatException при запуске программы, поскольку он не считает пустую строку допустимым числовым форматом.

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

Здесь переменная value это уже двойник и не нужно разбирать, а переменная 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");
        }
    }
}

Обратите внимание, что вам нужно нажать клавишу ввода в одном из двух полей, чтобы обновить поле области. Вот что нужно для запуска ActionListener для JTextField.

Другие вопросы по тегам