您好,登录后才能下订单哦!
在Java编程中,图形用户界面(GUI)是开发桌面应用程序的重要组成部分。通过GUI,用户可以直观地与程序进行交互,而无需通过命令行输入。本文将详细介绍如何使用Java的Swing库来实现一个简单的加法计算器。我们将从基本概念开始,逐步构建一个功能完整的加法计算器。
Swing是Java提供的一个用于创建图形用户界面的库。它是Java Foundation Classes(JFC)的一部分,提供了丰富的组件和工具,用于构建跨平台的桌面应用程序。Swing组件是轻量级的,不依赖于操作系统的原生窗口系统,因此可以在不同的平台上保持一致的界面风格。
在实现加法计算器时,我们将使用以下Swing组件:
首先,我们需要创建一个主窗口来容纳所有的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的创建和更新在事件调度线程中进行。
接下来,我们需要在窗口中添加两个输入框用于输入数字,一个按钮用于触发加法操作,以及一个标签用于显示结果。
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
用于显示结果。
现在,我们需要为“计算”按钮添加事件监听器,以便在用户点击按钮时执行加法操作并显示结果。
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
并显示错误信息。
为了进一步提升用户体验,我们可以添加一些额外的功能,例如:
我们可以为输入框添加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
,当用户输入内容时,程序会实时验证输入是否为数字。如果输入无效,计算按钮将被禁用。
我们可以添加一个“清空”按钮,用于清空输入框和结果。
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
。当用户点击“清空”按钮时,输入框和结果将被清空。
我们可以为“计算”按钮添加快捷键,例如按下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
键时,程序会执行加法操作。
通过本文的介绍,我们学习了如何使用Java的Swing库来实现一个简单的加法计算器。我们从创建主窗口开始,逐步添加输入框、按钮和事件监听器,最终实现了一个功能完整的加法计算器。我们还通过输入验证、清空按钮和键盘快捷键等功能进一步优化了用户体验。
希望本文能够帮助你理解Java GUI编程的基本概念,并激发你进一步探索和开发更复杂的桌面应用程序。如果你有任何问题或建议,欢迎在评论区留言讨论。
以下是本文中实现的加法计算器的完整代码:
”`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("结果: 输入无效");
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。