【问题标题】:Java JFrame will not update inputted textJava JFrame 不会更新输入的文本
【发布时间】:2021-01-11 03:18:41
【问题描述】:

与 python 相比,我对 java 还是很陌生,真正使用它大约 5 个月,直到 2 个月前才将它用于 android 开发。我想了解更多关于 java 的知识,特别是因为我基本上只是跳过了 android 开发的东西,并且只学习了我正在从事的任何项目所需的东西。为了帮助我学习,我决定学习用 swing 和一个简单的计算器制作一个 GUI。我在一两个小时内就完成了,不算学习 Swing,对于第一个非 Android Java 程序我很满意

我遇到的问题是,当您输入 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 mult;
    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() && !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");
        }
    }
}

是的,我知道变量有点令人困惑,但我对命名约定还不是很熟悉,我认为这是一个程序,我只是用来学习一些我并不真正需要的选择的东西使用它们,尤其是因为我不打算将其实际发布到任何地方。

编辑:我瞎了,第一个数字取了两次,而不是两个数字都取了

【问题讨论】:

  • String snum2 = tnum1.getText(); 应该是 String snum2 = tnum2.getText();

标签: java string swing math user-input


【解决方案1】:

所以我想我发现了你的问题。你唯一需要改变的就是这个。

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

这部分应该放在actionPerformed中。我认为您遇到的唯一问题是您使用了第一个变量两次,而不是第一次和第二次来进行数学运算。

【讨论】:

    【解决方案2】:

    我重新排列了您的代码,因为我想解释一些关于 Swing 开发的原则。

    这是我创建的 GUI。

    1. 所有 Swing 应用程序都必须以调用 SwingUtilities invokeLater 方法开始。此方法调用确保所有 Swing 组件都在 Event Dispatch Thread 上创建和执行。

    2. Swing 组件的绝对定位做起来很痛苦,而且不利于人们使用的各种操作系统和显示器分辨率。我使用GridBagLayout 主JPanel 和FlowLayout 按钮JPanel。当然,代码看起来更复杂。但我不必计算任何组件的大小或位置。 Swing layout managers 为我做这件事。

    3. 我添加了几个 JFrame 方法来给 GUI 一个标题,并根据操作系统将它定位在屏幕上。

    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 mult;
        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() 
                    && !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(); 即可

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 2013-04-08
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多