Java JFrame не обновит введенный текст

#java #string #swing #math #user-input

#java #строка #качать #математика #пользовательский ввод

Вопрос:

Я довольно новичок в Java по сравнению с python, используя его только около 5 месяцев, и до 2 месяцев назад использовал его только для разработки Android. Я хочу узнать больше о Java, тем более, что я в основном просто пропустил прямой доступ к материалам Android dev и узнал только то, что мне было нужно для любого проекта, над которым я работал. Чтобы помочь мне учиться, я решил научиться создавать графический интерфейс с помощью swing и простого калькулятора. Я сделал это за час или два, не считая обучения swing, и для самой первой Java-программы, не относящейся к Android, я очень доволен этим

проблема, с которой я сталкиваюсь, заключается в том, что когда вы вводите 2 числа, нажимаете кнопку для выполнения вычисления, затем меняете числа и делаете это снова, программа все равно будет использовать исходные числа, несмотря на то, что их больше нет

Он считывает, когда во входных данных нет чисел или отсутствует число, но просто не будет использовать новые числа для каких-либо вычислений.

вот вся программа, извините за плохо названные переменные и вообще плохой код

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

public class calc implements ActionListener {

    private JLabel num1;
    private JLabel num2;
    private JLabel lans;
    private JFrame frame;
    private JButton add;
    private JButton sub;
    private JButton mu<
    private JButton div;
    private JPanel panel;
    private JTextField tnum1;
    private JTextField tnum2;

    public calc() {
        panel = new JPanel();
        frame = new JFrame();
        frame.setSize(300, 300);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);

        panel.setLayout(null);

        num1 = new JLabel("1st Number");
        num1.setBounds(20, 20, 80, 25);
        panel.add(num1);

        num2 = new JLabel("2nd Number");
        num2.setBounds(20, 50, 80, 25);
        panel.add(num2);

        tnum1 = new JTextField();
        tnum1.setBounds(100, 20, 80, 25);
        panel.add(tnum1);

        tnum2 = new JTextField();
        tnum2.setBounds(100, 50, 80, 25);
        panel.add(tnum2);

        add = new JButton(" ");
        add.setBounds(20, 100, 50, 40);
        add.addActionListener(this);
        panel.add(add);

        sub = new JButton("-");
        sub.setBounds(80, 100, 50, 40);
        sub.addActionListener(this);
        panel.add(sub);

        mult = new JButton("×");
        mult.setBounds(140, 100, 50, 40);
        mult.addActionListener(this);
        panel.add(mult);

        div = new JButton("÷");
        div.setBounds(200, 100, 50, 40);
        div.addActionListener(this);
        panel.add(div);

        lans = new JLabel("");
        lans.setBounds(120, 150, 150, 25);
        panel.add(lans);

        frame.setVisible(true);
    }

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

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!tnum1.getText().isEmpty() amp;amp; !tnum2.getText().isEmpty()) {
            String snum1 = tnum1.getText();
            String snum2 = tnum1.getText();
            Double fnum1 = Double.valueOf(snum1);
            Double fnum2 = Double.valueOf(snum2);

            if (e.getSource() == add) {
                Double nans = fnum1   fnum2;
                lans.setText(String.valueOf(nans));

            } else if (e.getSource() == sub) {
                Double nans = fnum1 - fnum2;
                lans.setText(String.valueOf(nans));

            } else if (e.getSource() == mult) {
                Double nans = fnum1 * fnum2;
                lans.setText(String.valueOf(nans));

            } else if (e.getSource() == div) {
                Double nans = fnum1 / fnum2;
                lans.setText(String.valueOf(nans));
            }

        } else if (!tnum1.getText().isEmpty()) {
            lans.setText("No number 2");

        } else if (!tnum2.getText().isEmpty()) {
            lans.setText("No number 1");

        } else {
            lans.setText("enter 2 numbers");
        }
    }
}
  

да, я знаю, что переменные немного сбивают с толку, но я еще не очень хорошо знаком с соглашениями об именах, и я подумал, что, поскольку это была программа, которую я использовал только для изучения нескольких избранных вещей, мне действительно не нужно было их использовать, тем более, что я не планировал размещать это где-либо.

Редактировать: я слепой, взял первое число дважды вместо того, чтобы брать оба числа

Комментарии:

1. Строка snum2 = tnum1.getText(); должна быть строка snum2 = tnum2.getText();

Ответ №1:

итак, я думаю, что нашел вашу проблему. Единственное, что вам нужно изменить, это это.

 int snum1 = Integer.parseInt(tnum1.getText());
int snum2 = Integer.parseInt(tnum2.getText());
  

Эта часть должна быть включена в actionPerformed . Я думаю, что единственная проблема, с которой вы столкнулись, заключалась в том, что вы использовали первую переменную два раза, а не первую и вторую для выполнения ваших вычислений.

Ответ №2:

Я перестроил ваш код, потому что хотел объяснить несколько принципов разработки Swing.

Вот графический интерфейс, который я создал.

Графический интерфейс калькулятора

  1. Все приложения Swing должны начинаться с вызова SwingUtilities invokeLater метода. Этот вызов метода гарантирует, что все компоненты Swing будут созданы и выполнены в потоке отправки событий.

  2. Абсолютное позиционирование компонентов Swing является болезненным и не способствует различным операционным системам и разрешениям мониторов, которые используют люди. Я использовал GridBagLayout для main JPanel и FlowLayout для кнопки JPanel . Конечно, код выглядит более сложным. Но мне не нужно было вычислять размер или местоположение какого-либо компонента. Менеджеры компоновки Swing делают это за меня.

  3. Я добавил пару JFrame методов, чтобы присвоить графическому интерфейсу заголовок и расположить его на экране в соответствии с операционной системой.

  4. Я разбил код создания GUI на методы, чтобы я мог сосредоточиться на одной части GUI за раз.

Вот код.

 import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class SimpleCalculatorGUI implements ActionListener {

    private JLabel lans;
    private JFrame frame;
    private JButton add;
    private JButton sub;
    private JButton mu<
    private JButton div;
    private JTextField tnum1;
    private JTextField tnum2;

    public SimpleCalculatorGUI() {
        frame = new JFrame();
        frame.setTitle("Calculator");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel());
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
           panel.setLayout(new GridBagLayout());
           panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
           
           GridBagConstraints gbc = new GridBagConstraints();
           gbc.anchor = GridBagConstraints.LINE_START;
           gbc.fill = GridBagConstraints.HORIZONTAL;
           gbc.insets = new Insets(5, 5, 5, 5);
           gbc.gridx = 0;
           gbc.gridy = 0;
           gbc.weightx = 1d;

           JLabel num1 = new JLabel("1st Number");
           panel.add(num1, gbc);

           gbc.gridx  ;
           tnum1 = new JTextField(10);
           panel.add(tnum1, gbc);
           
           gbc.gridx = 0;
           gbc.gridy  ;
           JLabel num2 = new JLabel("2nd Number");
           panel.add(num2, gbc);

           gbc.gridx  ;
           tnum2 = new JTextField(10);
           panel.add(tnum2, gbc);
           
           gbc.gridx = 0;
           gbc.gridy  ;
           gbc.gridwidth = 2;
           panel.add(createButtonPanel(), gbc);

           gbc.gridy  ;
           lans = new JLabel(" ");
           lans.setHorizontalAlignment(JLabel.CENTER);
           panel.add(lans, gbc);
           
           return panel;
    }
    
    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        
         add = new JButton(" ");
         add.addActionListener(this);
         panel.add(add);

         sub = new JButton("-");
         sub.addActionListener(this);
         panel.add(sub);

         mult = new JButton("×");
         mult.addActionListener(this);
         panel.add(mult);

         div = new JButton("÷");
         div.addActionListener(this);
         panel.add(div);
         
         return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SimpleCalculatorGUI();
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!tnum1.getText().isEmpty() 
                amp;amp; !tnum2.getText().isEmpty()) {
            String snum1 = tnum1.getText();
            String snum2 = tnum2.getText();
            Double fnum1 = Double.valueOf(snum1);
            Double fnum2 = Double.valueOf(snum2);

            if (e.getSource() == add) {
                Double nans = fnum1   fnum2;
                lans.setText(String.valueOf(nans));

            } else if (e.getSource() == sub) {
                Double nans = fnum1 - fnum2;
                lans.setText(String.valueOf(nans));

            } else if (e.getSource() == mult) {
                Double nans = fnum1 * fnum2;
                lans.setText(String.valueOf(nans));

            } else if (e.getSource() == div) {
                Double nans = fnum1 / fnum2;
                lans.setText(String.valueOf(nans));
            }

        } else if (!tnum1.getText().isEmpty()) {
            lans.setText("No number 2");

        } else if (!tnum2.getText().isEmpty()) {
            lans.setText("No number 1");

        } else {
            lans.setText("Enter 2 numbers");
        }
    
    }
    
}
  

Ответ №3:

проблема с вашим кодом заключается в том, что вы использовали tnum1.getText() время буксировки вместо tnum2.getText()

вам просто нужно изменить третью строку в actionPerformed(e) на String snum2 = tnum2.getText(); , и она будет работать