简体   繁体   中英

How to get text from a textfield using a button in Java Swing, then add it to the panel?

I have been developing a calculator with a user interface for about 2 days overall, and was about to finish it until I was abruptly interrupted in my progress by an error (not exactly an error).

Here is my code

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

public class GUI implements ActionListener {

    double solution = 0;
    JButton button;
    JLabel answerLabel;
    JPanel panel;
    JTextField firstNumber;
    JTextField operator;
    JTextField secondNumber;

    public GUI(){
        JFrame frame = new JFrame();

        button = new JButton("Solve");
        button.addActionListener(this);

        JLabel label = new JLabel("Welcome to Calculator");
        label.setFont(new Font("Consolas", Font.BOLD, 30));

        JLabel enterFirstNumber = new JLabel("Enter first number:");
        enterFirstNumber.setFont(new Font("Consolas", Font.BOLD, 20));

        JLabel enterOperator = new JLabel("Enter your operator(+, -, *, /):");
        enterOperator.setFont(new Font("Consolas", Font.BOLD, 20));

        JLabel enterSecondNumber = new JLabel("Enter second number");
        enterSecondNumber.setFont(new Font("Consolas", Font.BOLD, 20));

        firstNumber = new JTextField();
        firstNumber.setFont(new Font("Consolas", Font.BOLD, 35));

        operator = new JTextField();
        operator.setFont(new Font("Consolas", Font.BOLD, 35));

        secondNumber = new JTextField();
        secondNumber.setFont(new Font("Consolas", Font.BOLD, 35));

        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
        panel.setLayout(new GridLayout(0, 1));
        panel.add(label);
        panel.add(enterFirstNumber);
        panel.add(firstNumber);
        panel.add(enterOperator);
        panel.add(operator);
        panel.add(enterSecondNumber);
        panel.add(secondNumber);
        panel.add(button);

        frame.add(panel, BorderLayout.CENTER);
        frame.setSize(450, 450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Calculator");
        frame.setVisible(true);
        frame.setResizable(false);

        double firstNumberValue = Double.parseDouble(firstNumber.getText());
        String operatorChoice = operator.getText();
        double secondNumberValue = Double.parseDouble(secondNumber.getText());
        System.out.println(firstNumberValue + secondNumberValue + operatorChoice);
    }

    public static void main(String[] args) {
        new GUI();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        double firstTextBox = Double.parseDouble(firstNumber.getText());
        String operatorValue = operator.getText();
        double secondTextBox = Double.parseDouble(secondNumber.getText());

        if (Objects.equals(operatorValue, "+")) {
            solution = firstTextBox+secondTextBox;
        }
        if (Objects.equals(operatorValue, "-")) {
            solution = firstTextBox+secondTextBox;
        }
        if (Objects.equals(operatorValue, "*")) {
            solution = firstTextBox*secondTextBox;
        }
        if (Objects.equals(operatorValue, "/")) {
            solution = firstTextBox/secondTextBox;
        }
        answerLabel = new JLabel(String.valueOf(solution));
        panel.add(answerLabel);
    }
}

At the end I add a "method" action performed in which I use panel.add(anwerLabel); . However, this does not work.

Alongside this, if anyone can point out the other redundancies in my code that would be helpful, as I have recently started learning Java.

Thanks.

The below code implements the suggestion from @AndrewThompson in his comment , ie

Since a label with no text or icon is invisible, I'd add the label to the GUI at start-up and simply change the state (in this case the text) when the action listener fires.

The below code is the same as the code in your question with the following changes:

  • I initialize answerLabel in the constructor (of class GUI ).
  • I set the text of answerLabel in method actionPerformed .
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GUI implements ActionListener {

    double solution = 0;
    JButton button;
    JLabel answerLabel;
    JPanel panel;
    JTextField firstNumber;
    JTextField operator;
    JTextField secondNumber;

    public GUI() {
        JFrame frame = new JFrame();

        button = new JButton("Solve");
        button.addActionListener(this);

        JLabel label = new JLabel("Welcome to Calculator");
        label.setFont(new Font("Consolas", Font.BOLD, 30));

        JLabel enterFirstNumber = new JLabel("Enter first number:");
        enterFirstNumber.setFont(new Font("Consolas", Font.BOLD, 20));

        JLabel enterOperator = new JLabel("Enter your operator(+, -, *, /):");
        enterOperator.setFont(new Font("Consolas", Font.BOLD, 20));

        JLabel enterSecondNumber = new JLabel("Enter second number");
        enterSecondNumber.setFont(new Font("Consolas", Font.BOLD, 20));

        firstNumber = new JTextField();
        firstNumber.setFont(new Font("Consolas", Font.BOLD, 35));

        operator = new JTextField();
        operator.setFont(new Font("Consolas", Font.BOLD, 35));

        secondNumber = new JTextField();
        secondNumber.setFont(new Font("Consolas", Font.BOLD, 35));

        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
        panel.setLayout(new GridLayout(0, 1));
        panel.add(label);
        panel.add(enterFirstNumber);
        panel.add(firstNumber);
        panel.add(enterOperator);
        panel.add(operator);
        panel.add(enterSecondNumber);
        panel.add(secondNumber);
        answerLabel = new JLabel("       "); // Added this line.
        panel.add(answerLabel); // Added this line.
        panel.add(button);

        frame.add(panel, BorderLayout.CENTER);
        frame.setSize(450, 450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Calculator");
        frame.setVisible(true);
        frame.setResizable(false);
    }

    public static void main(String[] args) {
        new GUI();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        double firstTextBox = Double.parseDouble(firstNumber.getText());
        String operatorValue = operator.getText();
        double secondTextBox = Double.parseDouble(secondNumber.getText());

        if (Objects.equals(operatorValue, "+")) {
            solution = firstTextBox + secondTextBox;
        }
        if (Objects.equals(operatorValue, "-")) {
            solution = firstTextBox + secondTextBox;
        }
        if (Objects.equals(operatorValue, "*")) {
            solution = firstTextBox * secondTextBox;
        }
        if (Objects.equals(operatorValue, "/")) {
            solution = firstTextBox / secondTextBox;
        }
        answerLabel.setText(String.valueOf(solution));
    }
}

Here's how it looks when I run the above code:

截屏为 gif 动画

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM