Ошибки кодирования калькулятора. Пожалуйста, исправьте это - PullRequest
0 голосов
/ 05 апреля 2020

Я пытался написать простой калькулятор, используя GUI в java, но застрял в этом коде и неоднократно получал сообщение «ENTER VALID NUMBERS». Я открыт для предложений. Предложите возможные исправления в моем коде. Я думаю, что я неправильно использовал функцию проверки и проверки исключения java.

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.SwingConstants;

public class FIRSTCALC {

private JFrame frame;
private JTextField txtfield1;
private JTextField txtfield2;
private JTextField textfieldans;

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

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

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    txtfield1 = new JTextField();
    txtfield1.setHorizontalAlignment(SwingConstants.LEFT);
    txtfield1.setText("ENTER NUMBER 1 : ");
    txtfield1.setBounds(28, 11, 178, 68);
    frame.getContentPane().add(txtfield1);
    txtfield1.setColumns(10);

    txtfield2 = new JTextField();
    txtfield2.setHorizontalAlignment(SwingConstants.LEFT);
    txtfield2.setText("ENTER NUMBER 2 : ");
    txtfield2.setBounds(228, 11, 175, 68);
    frame.getContentPane().add(txtfield2);
    txtfield2.setColumns(10);

    JButton btnNewButton = new JButton("ADD");
    btnNewButton.setToolTipText("TO ADD NUMBERS");
    btnNewButton.setFont(new Font("Sitka Text", Font.BOLD, 16));
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int num1,num2,sum;
            try
            {
                num1=Integer.parseInt(txtfield1.getText());
                num2=Integer.parseInt(txtfield2.getText());
                sum=num1+num2;
                textfieldans.setText(Integer.toString(sum));
            }
            catch(Exception e1)
            {
                JOptionPane.showMessageDialog(null, "ENTER VALID NUMBER");
            }
        }
    });
    btnNewButton.setBounds(61, 121, 120, 42);
    frame.getContentPane().add(btnNewButton);

    JButton btnNewButton_1 = new JButton("SUBTRACT");
    btnNewButton_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int num1,num2,sum;
            try
            {
                num1=Integer.parseInt(txtfield1.getText());
                num2=Integer.parseInt(txtfield2.getText());
                sum=num1-num2;
                textfieldans.setText(Integer.toString(sum));
            }
            catch(Exception e1)
            {
                JOptionPane.showMessageDialog(null, "ENTER VALID NUMBER");
            }   
        }
    });
    btnNewButton_1.setToolTipText("TO SUBTRACT NUMBERS");
    btnNewButton_1.setFont(new Font("Sitka Text", Font.BOLD, 16));
    btnNewButton_1.setBounds(251, 121, 128, 42);
    frame.getContentPane().add(btnNewButton_1);

    JLabel lblNewLabel = new JLabel("THE ANSWER IS :");
    lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
    lblNewLabel.setFont(new Font("Sitka Text", Font.BOLD, 18));
    lblNewLabel.setBounds(28, 192, 193, 58);
    frame.getContentPane().add(lblNewLabel);

    textfieldans = new JTextField();
    textfieldans.setBounds(251, 196, 109, 48);
    frame.getContentPane().add(textfieldans);
    textfieldans.setColumns(10);
}

}

1 Ответ

0 голосов
/ 06 апреля 2020

Вы, очевидно, получаете исключение, потому что добавляете или добавляете введенный номер к тексту, уже содержащемуся в одном из полей JTextFields. Это сгенерирует NumberFormatException при попытке проанализировать строку, содержащуюся в JTextField, в целочисленное значение с помощью метода Integer.parseInt () . Если что-либо , кроме числовых цифр, предоставляется, то это исключение будет выдано. Вы просто заставляете исключение отображать окно сообщения, указывающее пользователю на "ENTER VALID NUMBER".

Если вы хотите сохранить текст внутри компонентов текстового поля, тогда примените слушатель фокуса, чтобы выделить текст, который в данный момент находится в компонент, так что он перезаписывается, когда пользователь вводит число. Обычно этот предварительный текст имеет более светлый серый цвет. Вот пример:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class FIRSTCALC {

    private JFrame frame;
    private JTextField txtfield1;
    private JTextField txtfield2;
    private JTextField textfieldans;

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

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

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setAlwaysOnTop(true);
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        txtfield1 = new JTextField("Enter First Number");
        txtfield1.setForeground(Color.lightGray);
        // Add a Focus Listener to txtfield1
        txtfield1.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                txtfield1.selectAll();
            }

            @Override
            public void focusLost(FocusEvent e) { 
                txtfield1.setForeground(Color.black);
            }
        });
        txtfield1.setHorizontalAlignment(SwingConstants.CENTER);
        txtfield1.setBounds(28, 11, 178, 68);
        txtfield1.setColumns(10);
        frame.getContentPane().add(txtfield1);

        txtfield2 = new JTextField("Enter Second Number");
        txtfield2.setForeground(Color.lightGray);
        // Add a Focus Listener to txtfield2
        txtfield2.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                txtfield2.selectAll();
            }

            @Override
            public void focusLost(FocusEvent e) {
                txtfield2.setForeground(Color.black);
            }
        });
        txtfield2.setHorizontalAlignment(SwingConstants.CENTER);
        txtfield2.setBounds(228, 11, 175, 68);
        txtfield2.setColumns(10);
        frame.getContentPane().add(txtfield2);

        JButton btnNewButton = new JButton("ADD");
        btnNewButton.setToolTipText("TO ADD NUMBERS");
        btnNewButton.setFont(new Font("Sitka Text", Font.BOLD, 16));
        btnNewButton.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                int num1, num2, sum;
                try {
                    num1 = Integer.parseInt(txtfield1.getText());
                    num2 = Integer.parseInt(txtfield2.getText());
                    sum = num1 + num2;
                    textfieldans.setText(Integer.toString(sum));
                }
                catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(frame, "<html><center>The following formula:<br><br>"
                                + "<font size='4' color=red>" + txtfield1.getText() + 
                                "</font> + <font size='4' color=red>"+ txtfield2.getText() + 
                                "</font><br><br>contains invalid digits!</center></html>");
                }
            }
        });
        btnNewButton.setBounds(61, 121, 120, 42);
        frame.getContentPane().add(btnNewButton);

        JButton btnNewButton_1 = new JButton("SUBTRACT");
        btnNewButton_1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int num1, num2, sum;
                try {
                    num1 = Integer.parseInt(txtfield1.getText());
                    num2 = Integer.parseInt(txtfield2.getText());
                    sum = num1 - num2;
                    textfieldans.setText(Integer.toString(sum));
                }
                catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(frame, "<html><center>The following formula:<br><br>"
                                + "<font size='4' color=red>" + txtfield1.getText() + 
                                "</font> - <font size='4' color=red>"+ txtfield2.getText() + 
                                "</font><br><br>contains invalid digits!</center></html>");
                }
            }
        });
        btnNewButton_1.setToolTipText("TO SUBTRACT NUMBERS");
        btnNewButton_1.setFont(new Font("Sitka Text", Font.BOLD, 16));
        btnNewButton_1.setBounds(251, 121, 128, 42);
        frame.getContentPane().add(btnNewButton_1);

        JLabel lblNewLabel = new JLabel("THE ANSWER IS :");
        lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
        lblNewLabel.setFont(new Font("Sitka Text", Font.BOLD, 18));
        lblNewLabel.setBounds(28, 192, 193, 58);
        frame.getContentPane().add(lblNewLabel);

        textfieldans = new JTextField();
        textfieldans.setHorizontalAlignment(SwingConstants.CENTER);
        textfieldans.setBounds(251, 196, 109, 48);
        textfieldans.setColumns(10);
        frame.getContentPane().add(textfieldans);
        frame.setLocationRelativeTo(null);

    }

}
...