java图形界面之怎么实现加法计算器

发布时间:2022-04-26 10:03:54 作者:iii
来源:亿速云 阅读:158

Java图形界面之怎么实现加法计算器

引言

在Java编程中,图形用户界面(GUI)是开发桌面应用程序的重要组成部分。通过GUI,用户可以直观地与程序进行交互,而无需通过命令行输入。本文将详细介绍如何使用Java的Swing库来实现一个简单的加法计算器。我们将从基本概念开始,逐步构建一个功能完整的加法计算器。

1. Java GUI编程基础

1.1 Swing简介

Swing是Java提供的一个用于创建图形用户界面的库。它是Java Foundation Classes(JFC)的一部分,提供了丰富的组件和工具,用于构建跨平台的桌面应用程序。Swing组件是轻量级的,不依赖于操作系统的原生窗口系统,因此可以在不同的平台上保持一致的界面风格。

1.2 常用Swing组件

在实现加法计算器时,我们将使用以下Swing组件:

2. 创建加法计算器的步骤

2.1 创建主窗口

首先,我们需要创建一个主窗口来容纳所有的GUI组件。我们可以通过继承JFrame类来实现这一点。

import javax.swing.*;

public class Calculator extends JFrame {
    public Calculator() {
        setTitle("加法计算器");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

在上面的代码中,我们创建了一个Calculator类,继承自JFrame。在构造函数中,我们设置了窗口的标题、大小、关闭操作以及窗口居中显示。main方法中使用SwingUtilities.invokeLater来确保GUI的创建和更新在事件调度线程中进行。

2.2 添加输入框和按钮

接下来,我们需要在窗口中添加两个输入框用于输入数字,一个按钮用于触发加法操作,以及一个标签用于显示结果。

import javax.swing.*;
import java.awt.*;

public class Calculator extends JFrame {
    private JTextField num1Field;
    private JTextField num2Field;
    private JLabel resultLabel;

    public Calculator() {
        setTitle("加法计算器");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示

        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(4, 2));

        // 添加组件
        panel.add(new JLabel("数字1:"));
        num1Field = new JTextField();
        panel.add(num1Field);

        panel.add(new JLabel("数字2:"));
        num2Field = new JTextField();
        panel.add(num2Field);

        JButton addButton = new JButton("计算");
        panel.add(addButton);

        resultLabel = new JLabel("结果:");
        panel.add(resultLabel);

        // 添加面板到窗口
        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

在上面的代码中,我们创建了一个JPanel面板,并使用GridLayout布局管理器将组件排列成4行2列的网格。我们添加了两个JTextField用于输入数字,一个JButton用于触发加法操作,以及一个JLabel用于显示结果。

2.3 实现加法逻辑

现在,我们需要为“计算”按钮添加事件监听器,以便在用户点击按钮时执行加法操作并显示结果。

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

public class Calculator extends JFrame {
    private JTextField num1Field;
    private JTextField num2Field;
    private JLabel resultLabel;

    public Calculator() {
        setTitle("加法计算器");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示

        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(4, 2));

        // 添加组件
        panel.add(new JLabel("数字1:"));
        num1Field = new JTextField();
        panel.add(num1Field);

        panel.add(new JLabel("数字2:"));
        num2Field = new JTextField();
        panel.add(num2Field);

        JButton addButton = new JButton("计算");
        panel.add(addButton);

        resultLabel = new JLabel("结果:");
        panel.add(resultLabel);

        // 添加事件监听器
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(num1Field.getText());
                    double num2 = Double.parseDouble(num2Field.getText());
                    double result = num1 + num2;
                    resultLabel.setText("结果: " + result);
                } catch (NumberFormatException ex) {
                    resultLabel.setText("结果: 输入无效");
                }
            }
        });

        // 添加面板到窗口
        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

在上面的代码中,我们为“计算”按钮添加了一个ActionListener,当用户点击按钮时,程序会读取两个输入框中的文本,将其转换为double类型,执行加法操作,并将结果显示在resultLabel中。如果输入无效(例如输入了非数字字符),程序会捕获NumberFormatException并显示错误信息。

2.4 优化用户体验

为了进一步提升用户体验,我们可以添加一些额外的功能,例如:

2.4.1 输入验证

我们可以为输入框添加DocumentListener,在用户输入时实时验证输入内容是否为数字。

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame {
    private JTextField num1Field;
    private JTextField num2Field;
    private JLabel resultLabel;

    public Calculator() {
        setTitle("加法计算器");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示

        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(4, 2));

        // 添加组件
        panel.add(new JLabel("数字1:"));
        num1Field = new JTextField();
        panel.add(num1Field);

        panel.add(new JLabel("数字2:"));
        num2Field = new JTextField();
        panel.add(num2Field);

        JButton addButton = new JButton("计算");
        panel.add(addButton);

        resultLabel = new JLabel("结果:");
        panel.add(resultLabel);

        // 添加事件监听器
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(num1Field.getText());
                    double num2 = Double.parseDouble(num2Field.getText());
                    double result = num1 + num2;
                    resultLabel.setText("结果: " + result);
                } catch (NumberFormatException ex) {
                    resultLabel.setText("结果: 输入无效");
                }
            }
        });

        // 添加输入验证
        DocumentListener documentListener = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                validateInput();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                validateInput();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                validateInput();
            }

            private void validateInput() {
                try {
                    Double.parseDouble(num1Field.getText());
                    Double.parseDouble(num2Field.getText());
                    addButton.setEnabled(true);
                } catch (NumberFormatException ex) {
                    addButton.setEnabled(false);
                }
            }
        };

        num1Field.getDocument().addDocumentListener(documentListener);
        num2Field.getDocument().addDocumentListener(documentListener);

        // 添加面板到窗口
        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

在上面的代码中,我们为输入框添加了DocumentListener,当用户输入内容时,程序会实时验证输入是否为数字。如果输入无效,计算按钮将被禁用。

2.4.2 清空按钮

我们可以添加一个“清空”按钮,用于清空输入框和结果。

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame {
    private JTextField num1Field;
    private JTextField num2Field;
    private JLabel resultLabel;

    public Calculator() {
        setTitle("加法计算器");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示

        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(5, 2));

        // 添加组件
        panel.add(new JLabel("数字1:"));
        num1Field = new JTextField();
        panel.add(num1Field);

        panel.add(new JLabel("数字2:"));
        num2Field = new JTextField();
        panel.add(num2Field);

        JButton addButton = new JButton("计算");
        panel.add(addButton);

        JButton clearButton = new JButton("清空");
        panel.add(clearButton);

        resultLabel = new JLabel("结果:");
        panel.add(resultLabel);

        // 添加事件监听器
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(num1Field.getText());
                    double num2 = Double.parseDouble(num2Field.getText());
                    double result = num1 + num2;
                    resultLabel.setText("结果: " + result);
                } catch (NumberFormatException ex) {
                    resultLabel.setText("结果: 输入无效");
                }
            }
        });

        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                num1Field.setText("");
                num2Field.setText("");
                resultLabel.setText("结果:");
            }
        });

        // 添加输入验证
        DocumentListener documentListener = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                validateInput();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                validateInput();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                validateInput();
            }

            private void validateInput() {
                try {
                    Double.parseDouble(num1Field.getText());
                    Double.parseDouble(num2Field.getText());
                    addButton.setEnabled(true);
                } catch (NumberFormatException ex) {
                    addButton.setEnabled(false);
                }
            }
        };

        num1Field.getDocument().addDocumentListener(documentListener);
        num2Field.getDocument().addDocumentListener(documentListener);

        // 添加面板到窗口
        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

在上面的代码中,我们添加了一个“清空”按钮,并为其添加了ActionListener。当用户点击“清空”按钮时,输入框和结果将被清空。

2.4.3 键盘快捷键

我们可以为“计算”按钮添加快捷键,例如按下Enter键时执行加法操作。

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

public class Calculator extends JFrame {
    private JTextField num1Field;
    private JTextField num2Field;
    private JLabel resultLabel;

    public Calculator() {
        setTitle("加法计算器");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示

        // 创建面板
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(5, 2));

        // 添加组件
        panel.add(new JLabel("数字1:"));
        num1Field = new JTextField();
        panel.add(num1Field);

        panel.add(new JLabel("数字2:"));
        num2Field = new JTextField();
        panel.add(num2Field);

        JButton addButton = new JButton("计算");
        panel.add(addButton);

        JButton clearButton = new JButton("清空");
        panel.add(clearButton);

        resultLabel = new JLabel("结果:");
        panel.add(resultLabel);

        // 添加事件监听器
        ActionListener addAction = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(num1Field.getText());
                    double num2 = Double.parseDouble(num2Field.getText());
                    double result = num1 + num2;
                    resultLabel.setText("结果: " + result);
                } catch (NumberFormatException ex) {
                    resultLabel.setText("结果: 输入无效");
                }
            }
        };

        addButton.addActionListener(addAction);

        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                num1Field.setText("");
                num2Field.setText("");
                resultLabel.setText("结果:");
            }
        });

        // 添加快捷键
        InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = panel.getActionMap();
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "add");
        actionMap.put("add", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                addAction.actionPerformed(e);
            }
        });

        // 添加输入验证
        DocumentListener documentListener = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                validateInput();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                validateInput();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                validateInput();
            }

            private void validateInput() {
                try {
                    Double.parseDouble(num1Field.getText());
                    Double.parseDouble(num2Field.getText());
                    addButton.setEnabled(true);
                } catch (NumberFormatException ex) {
                    addButton.setEnabled(false);
                }
            }
        };

        num1Field.getDocument().addDocumentListener(documentListener);
        num2Field.getDocument().addDocumentListener(documentListener);

        // 添加面板到窗口
        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calculator = new Calculator();
            calculator.setVisible(true);
        });
    }
}

在上面的代码中,我们为“计算”按钮添加了Enter键的快捷键。当用户在输入框中按下Enter键时,程序会执行加法操作。

3. 总结

通过本文的介绍,我们学习了如何使用Java的Swing库来实现一个简单的加法计算器。我们从创建主窗口开始,逐步添加输入框、按钮和事件监听器,最终实现了一个功能完整的加法计算器。我们还通过输入验证、清空按钮和键盘快捷键等功能进一步优化了用户体验。

希望本文能够帮助你理解Java GUI编程的基本概念,并激发你进一步探索和开发更复杂的桌面应用程序。如果你有任何问题或建议,欢迎在评论区留言讨论。

4. 完整代码

以下是本文中实现的加法计算器的完整代码:

”`java import javax.swing.; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent;

public class Calculator extends JFrame { private JTextField num1Field; private JTextField num2Field; private JLabel resultLabel;

public Calculator() {
    setTitle("加法计算器");
    setSize(300, 200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null); // 居中显示

    // 创建面板
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(5, 2));

    // 添加组件
    panel.add(new JLabel("数字1:"));
    num1Field = new JTextField();
    panel.add(num1Field);

    panel.add(new JLabel("数字2:"));
    num2Field = new JTextField();
    panel.add(num2Field);

    JButton addButton = new JButton("计算");
    panel.add(addButton);

    JButton clearButton = new JButton("清空");
    panel.add(clearButton);

    resultLabel = new JLabel("结果:");
    panel.add(resultLabel);

    // 添加事件监听器
    ActionListener addAction = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double num1 = Double.parseDouble(num1Field.getText());
                double num2 = Double.parseDouble(num2Field.getText());
                double result = num1 + num2;
                resultLabel.setText("结果: " + result);
            } catch (NumberFormatException ex) {
                resultLabel.setText("结果: 输入无效");
推荐阅读:
  1. Python 5行代码 搞定加法计算器
  2. (一)加法计算器(第一个iOS APP)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:在Swoole上运行Laravel的原因是什么

下一篇:怎么利用Python实现网络测试

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》