目录
前言
要实现图形化界面,我们需要使用 Java 标准库中的 AWT 和 Swing 库,这篇文章会从建立文件到编译class文件到生成jar包在任何有java运行环境(jre)的系统中可以直接双击运行,运行的效果图如下
但是这个项目无法支持三个数据同时相加减等运算,还不够完善,只能作为一个新手入门项目
创建过程
1.首先我们在src下创建一个Calculator类
(图中.idea上方的项目名不一定是Calculator,可以是其他名字)
2.导入我们所需要的头文件
import java.awt.BorderLayout; // 用于创建边界布局管理器,将组件放置在北、南、东、西、中五个区域
import java.awt.Color; // 用于处理颜色,常用于设置组件的背景色或前景色
import java.awt.GridLayout; // 用于创建网格布局管理器,将容器划分为固定数量的行和列,每个单元格大小相等
import java.awt.event.ActionEvent; // 表示一个动作事件,如按钮点击事件
import java.awt.event.ActionListener; // 事件监听器接口,必须实现 actionPerformed 方法来处理动作事件
import javax.swing.JButton; // 用于创建按钮,按钮可以触发 ActionEvent 事件
import javax.swing.JFrame; // 顶层容器,用于创建应用程序主窗口
import javax.swing.JPanel; // 用于创建面板容器,可以包含其他组件并使用布局管理器
import javax.swing.JTextField; // 用于创建单行文本框,允许用户输入和显示文本
3.搭建项目的大体框架
搭建的大体思路:
将代码以方法的形式分离开,避免过度集中,方法之内衔接下一个方法,主函数里创建对象的时候完成初始化,初始化完成应用界面的布局,同时给新加的按钮添加监听器,初始化完成之后,等待用户操作,当用户输入”=“运算符时计算结果
其中对于第一句
解释如下
//Calculator 类扩展了(extends) JFrame 类,意味着它继承了创建和管理窗口的能力。 //同时,Calculator 实现(implements)了 ActionListener 接口,这意味着它能够响应用户在界面上执行的动作(如按钮点击)。 //通过实现 ActionListener,Calculator 类必须定义 actionPerformed 方法来处理按钮点击等动作事件。
4.运行顺序及初始化Calculator对象
运行顺序:
首先在main函数里面 新建一个Calculator对象-> 然后在创建对象的时候会自动因为public Calculator(String title)初始话Calculator对象-> 然后第一个首先super(title)设置你的标题-> 然后init()函数进行一些具体的初始化操作-> 并且在init()函数内调用addButtons()函数,addButtons()函数可以把数字,操作符都加入到图形,还有运算框界面-> 并且与此同时会对每个按钮加入一个监听-> 当用户点击这按钮时,会执行actionPerformed()函数,其中参数ActionEvent e 就是用户点击按钮的操作-> 在actionPerformed()函数里面我们会监听用户是否输入了”=”的运算符,如果是“=”我们会执行最后的calculateResult()函数。
初始化Calculator对象:
//这是负责初始化对象的,注意它与类的名字相同,但不是函数也不是类
public Calculator(String title) {
super(title);//确定你的app的窗口标题
init();
// 使窗口变为可见。调用这个方法后,窗口会显示在屏幕上。
// 如果不调用这个方法,即使窗口已经创建并设置了其他属性,它仍然不会显示出来。
this.setVisible(true);
// 设置窗口的大小为 300 像素宽和 300 像素高。
// 这行代码定义了窗口的初始尺寸。
this.setSize(300, 300);
// 将窗口的位置设置为屏幕的中心。
// 如果传递 null 作为参数,窗口会相对于屏幕居中显示。
// 这个方法的作用是使窗口在显示时居中于屏幕,提供更好的用户体验。
this.setLocationRelativeTo(null);
// 设置窗口的关闭操作。
// 当用户点击窗口的关闭按钮(X按钮)时,程序将退出。
// JFrame.EXIT_ON_CLOSE 表示关闭窗口时,程序将结束并退出运行。
// 其他选项包括 JFrame.DISPOSE_ON_CLOSE(关闭窗口但不退出程序)等。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
我们也要注意到,
this.setVisible(true);
this.setSize(300, 300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这几行是在init()函数后面的,我们在初始化的时候并没有进行仍何的点击操作,所以这几行代码会执行并设置窗口的属性,然后等待我们的操作
5.在main函数之前,实例化一些对象,以便后面使用
//JTextField 是一个用于输入单行文本的Swing组件,Swing 是 Java 中用于创建图形用户界面 (GUI)
// 的一组库。Swing 组件是用来构建图形用户界面的各种可视化元素,如按钮、文本框、标签、面板等。
// 它们位于 javax.swing 包中。Swing 组件是纯 Java 实现的轻量级组件,具有跨平台性,
// 并且基于 Java 基础类 (Java Foundation Classes, JFC) 提供丰富的 GUI 功能。
private JTextField expressText;
//JPanel 是一个轻量级的容器,可以包含和组织其他Swing组件。
//这两个面板用于布局和组织界面中的不同部分:数字按钮和操作按钮。
private JPanel numPanel, operPanel;
private String express = "";//用于存储计算器中的输入表达式
完善各种方法
1.init()函数
//初始化函数
private void init() {
// 设置主窗口的布局管理器为边界布局
// 边界布局允许将组件放置在东、南、西、北、中五个区域
this.setLayout(new BorderLayout());
// 创建一个面板,用于容纳表达式文本框和“Clear”按钮
// 这个面板的布局管理器设置为边界布局,以便可以将文本框和按钮放置在指定的位置
JPanel topPanel = new JPanel(new BorderLayout());
// 创建一个文本框,用于显示和输入数学表达式
// 设置文本框为不可编辑,背景颜色为黄色
expressText = new JTextField();
expressText.setEditable(false); // 文本框不可编辑
expressText.setBackground(Color.YELLOW); // 背景颜色设置为黄色
topPanel.add(expressText, BorderLayout.CENTER); // 将文本框添加到面板的中央
// 创建一个按钮,用于清空表达式文本框
JButton clearButton = new JButton("Clear");
clearButton.addActionListener(this); // 添加事件监听器,响应点击事件
topPanel.add(clearButton, BorderLayout.EAST); // 将“Clear”按钮添加到面板的右边
// 将包含表达式文本框和“Clear”按钮的面板添加到主窗口的北边(顶部)
this.add(topPanel, BorderLayout.NORTH);
// 创建一个面板,用于放置数字按钮,设置为网格布局
// 网格布局将面板划分为4行3列
numPanel = new JPanel();
numPanel.setLayout(new GridLayout(4, 3));
// 创建一个面板,用于放置操作按钮,设置为网格布局
// 网格布局将面板划分为5行1列
operPanel = new JPanel();
operPanel.setLayout(new GridLayout(5, 1));
// 调用addButtons方法,为数字按钮面板和操作按钮面板添加按钮并设置相应的监听器
addButtons(numPanel, operPanel);
// 将数字按钮面板添加到主窗口的中央区域
this.add(numPanel, BorderLayout.CENTER);
// 将操作按钮面板添加到主窗口的东边(右侧)
this.add(operPanel, BorderLayout.EAST);
}
2.addButtons()函数
//给图形界面加入按钮的
private void addButtons(JPanel numPanel, JPanel operPanel) {
// 数字按钮的标签数组
// 包含了0-9的数字按钮以及"00"和"^"按钮
String[] numLabels = {"7", "8", "9", "4", "5", "6", "1", "2", "3", "00", "0", "^"};
// 操作按钮的标签数组
// 包含了基本的四则运算操作符和等号
String[] operLabels = {"+", "-", "*", "/", "="};
// 遍历数字按钮标签数组
for (String label : numLabels) {
// 为每个标签创建一个新的JButton
JButton button = new JButton(label);
// 为按钮添加事件监听器,响应按钮点击事件
button.addActionListener(this);
// 将按钮添加到数字按钮面板(numPanel)中
numPanel.add(button);
}
// 遍历操作按钮标签数组
for (String label : operLabels) {
// 为每个标签创建一个新的JButton
JButton button = new JButton(label);
// 为按钮添加事件监听器,响应按钮点击事件
button.addActionListener(this);
// 将按钮添加到操作按钮面板(operPanel)中
operPanel.add(button);
}
}
3.actionPerformed()函数
//@Override 注解用于指示 actionPerformed 方法
// 是对ActionListener 接口中 actionPerformed 方法的覆盖。
@Override
// 这个方法是 ActionListener 接口的实现,用于响应用户按下按钮的事件
//我们点击按钮的操作(action)就是参数ActionEvent e
public void actionPerformed(ActionEvent e) {
// 获取触发事件的组件(即被点击的按钮)
JButton sourceButton = (JButton) e.getSource();
// 获取按钮上的文本(即按钮的标签)
String command = sourceButton.getText();
// 根据按钮的文本来处理不同的操作
switch (command) {
case "=":
// 如果按钮文本是“=”号,调用 calculateResult 方法来计算并显示结果
calculateResult();
break;
case "Clear":
// 如果按钮文本是“Clear”,清空文本框的内容
expressText.setText("");
break;
default:
// 对于其他按钮(数字和操作符),将按钮的文本追加到表达式文本框中
expressText.setText(expressText.getText() + command);
break;
}
}
4.calculateResult()函数
// 用于计算最终的结果
private void calculateResult() {
try {
// 获取当前表达式
// 从文本框中获取用户输入的表达式
String expression = expressText.getText();
// 分割数字和操作符
// 按运算符分割表达式,将其拆分为数字部分
// 正则表达式 [+\-*/%^] 匹配所有算术运算符
String[] nums = expression.split("[+\\-*/%^]");
// 按数字分割表达式,将其拆分为运算符部分
// 正则表达式 [0-9.]+ 匹配所有数字和小数点
String[] opers = expression.split("[0-9.]+");
// 检查分割后是否有足够的操作数和运算符
// 确保至少有两个操作数和两个运算符
if (nums.length < 2 || opers.length < 2) {
// 如果操作数或运算符数量不足,显示“输入错误”信息
expressText.setText("输入错误");
return;
}
// 解析操作数和运算符
// 将第一个操作数从字符串转换为 double,并去除多余的空白
double num1 = Double.parseDouble(nums[0].trim());
// 将第二个操作数从字符串转换为 double,并去除多余的空白
double num2 = Double.parseDouble(nums[1].trim());
// 获取运算符,并去除多余的空白
String oper = opers[1].trim();
// 计算结果
// 使用 switch 语句根据运算符计算结果
double result = switch (oper) {
case "+" -> num1 + num2; // 加法运算
case "-" -> num1 - num2; // 减法运算
case "*" -> num1 * num2; // 乘法运算
case "/" -> num2 != 0 ? num1 / num2 : Double.NaN; // 除法运算,除数不能为零
case "%" -> num1 % num2; // 取余运算
case "^" -> Math.pow(num1, num2); // 幂运算
default -> Double.NaN; // 默认情况,结果为 NaN 表示计算错误
};
// 显示结果或错误信息
// 如果结果为 NaN(计算错误),则显示“计算错误”信息
// 否则,将计算结果转换为字符串并显示
expressText.setText(Double.isNaN(result) ? "计算错误" : String.valueOf(result));
} catch (Exception e) {
// 捕获所有异常(例如,输入格式错误或解析错误),并显示“输入错误”信息
expressText.setText("输入错误");
}
// 计算完后清空表达式
// 清空表达式,以便进行新的计算
express = "";
}
完整代码以及打包
1.详细注释代码
import java.awt.BorderLayout; // 用于创建边界布局管理器,将组件放置在北、南、东、西、中五个区域
import java.awt.Color; // 用于处理颜色,常用于设置组件的背景色或前景色
import java.awt.GridLayout; // 用于创建网格布局管理器,将容器划分为固定数量的行和列,每个单元格大小相等
import java.awt.event.ActionEvent; // 表示一个动作事件,如按钮点击事件
import java.awt.event.ActionListener; // 事件监听器接口,必须实现 actionPerformed 方法来处理动作事件
import javax.swing.JButton; // 用于创建按钮,按钮可以触发 ActionEvent 事件
import javax.swing.JFrame; // 顶层容器,用于创建应用程序主窗口
import javax.swing.JPanel; // 用于创建面板容器,可以包含其他组件并使用布局管理器
import javax.swing.JTextField; // 用于创建单行文本框,允许用户输入和显示文本
//Calculator 类扩展了(extends) JFrame 类,意味着它继承了创建和管理窗口的能力。
//同时,Calculator 实现(implements)了 ActionListener 接口,这意味着它能够响应用户在界面上执行的动作(如按钮点击)。
//通过实现 ActionListener,Calculator 类必须定义 actionPerformed 方法来处理按钮点击等动作事件。
public class Calculator extends JFrame implements ActionListener {
//JTextField 是一个用于输入单行文本的Swing组件,Swing 是 Java 中用于创建图形用户界面 (GUI)
// 的一组库。Swing 组件是用来构建图形用户界面的各种可视化元素,如按钮、文本框、标签、面板等。
// 它们位于 javax.swing 包中。Swing 组件是纯 Java 实现的轻量级组件,具有跨平台性,
// 并且基于 Java 基础类 (Java Foundation Classes, JFC) 提供丰富的 GUI 功能。
private JTextField expressText;
//JPanel 是一个轻量级的容器,可以包含和组织其他Swing组件。
//这两个面板用于布局和组织界面中的不同部分:数字按钮和操作按钮。
private JPanel numPanel, operPanel;
private String express = "";//用于存储计算器中的输入表达式
public static void main(String[] args) {
new Calculator("我的计算器");
}
//这是负责初始化对象的,注意它与类的名字相同,但不是函数也不是类
public Calculator(String title) {
super(title);//确定你的app的窗口标题
init();
// 使窗口变为可见。调用这个方法后,窗口会显示在屏幕上。
// 如果不调用这个方法,即使窗口已经创建并设置了其他属性,它仍然不会显示出来。
this.setVisible(true);
// 设置窗口的大小为 300 像素宽和 300 像素高。
// 这行代码定义了窗口的初始尺寸。
this.setSize(300, 300);
// 将窗口的位置设置为屏幕的中心。
// 如果传递 null 作为参数,窗口会相对于屏幕居中显示。
// 这个方法的作用是使窗口在显示时居中于屏幕,提供更好的用户体验。
this.setLocationRelativeTo(null);
// 设置窗口的关闭操作。
// 当用户点击窗口的关闭按钮(X按钮)时,程序将退出。
// JFrame.EXIT_ON_CLOSE 表示关闭窗口时,程序将结束并退出运行。
// 其他选项包括 JFrame.DISPOSE_ON_CLOSE(关闭窗口但不退出程序)等。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//初始化函数
private void init() {
// 设置主窗口的布局管理器为边界布局
// 边界布局允许将组件放置在东、南、西、北、中五个区域
this.setLayout(new BorderLayout());
// 创建一个面板,用于容纳表达式文本框和“Clear”按钮
// 这个面板的布局管理器设置为边界布局,以便可以将文本框和按钮放置在指定的位置
JPanel topPanel = new JPanel(new BorderLayout());
// 创建一个文本框,用于显示和输入数学表达式
// 设置文本框为不可编辑,背景颜色为黄色
expressText = new JTextField();
expressText.setEditable(false); // 文本框不可编辑
expressText.setBackground(Color.YELLOW); // 背景颜色设置为黄色
topPanel.add(expressText, BorderLayout.CENTER); // 将文本框添加到面板的中央
// 创建一个按钮,用于清空表达式文本框
JButton clearButton = new JButton("Clear");
clearButton.addActionListener(this); // 添加事件监听器,响应点击事件
topPanel.add(clearButton, BorderLayout.EAST); // 将“Clear”按钮添加到面板的右边
// 将包含表达式文本框和“Clear”按钮的面板添加到主窗口的北边(顶部)
this.add(topPanel, BorderLayout.NORTH);
// 创建一个面板,用于放置数字按钮,设置为网格布局
// 网格布局将面板划分为4行3列
numPanel = new JPanel();
numPanel.setLayout(new GridLayout(4, 3));
// 创建一个面板,用于放置操作按钮,设置为网格布局
// 网格布局将面板划分为5行1列
operPanel = new JPanel();
operPanel.setLayout(new GridLayout(5, 1));
// 调用addButtons方法,为数字按钮面板和操作按钮面板添加按钮并设置相应的监听器
addButtons(numPanel, operPanel);
// 将数字按钮面板添加到主窗口的中央区域
this.add(numPanel, BorderLayout.CENTER);
// 将操作按钮面板添加到主窗口的东边(右侧)
this.add(operPanel, BorderLayout.EAST);
}
//给图形界面加入函数的
private void addButtons(JPanel numPanel, JPanel operPanel) {
// 数字按钮的标签数组
// 包含了0-9的数字按钮以及"00"和"^"按钮
String[] numLabels = {"7", "8", "9", "4", "5", "6", "1", "2", "3", "00", "0", "^"};
// 操作按钮的标签数组
// 包含了基本的四则运算操作符和等号
String[] operLabels = {"+", "-", "*", "/", "="};
// 遍历数字按钮标签数组
for (String label : numLabels) {
// 为每个标签创建一个新的JButton
JButton button = new JButton(label);
// 为按钮添加事件监听器,响应按钮点击事件
button.addActionListener(this);
// 将按钮添加到数字按钮面板(numPanel)中
numPanel.add(button);
}
// 遍历操作按钮标签数组
for (String label : operLabels) {
// 为每个标签创建一个新的JButton
JButton button = new JButton(label);
// 为按钮添加事件监听器,响应按钮点击事件
button.addActionListener(this);
// 将按钮添加到操作按钮面板(operPanel)中
operPanel.add(button);
}
}
//@Override 注解用于指示 actionPerformed 方法
// 是对ActionListener 接口中 actionPerformed 方法的覆盖。
@Override
// 这个方法是 ActionListener 接口的实现,用于响应用户按下按钮的事件
//我们点击按钮的操作(action)就是参数ActionEvent e
public void actionPerformed(ActionEvent e) {
// 获取触发事件的组件(即被点击的按钮)
JButton sourceButton = (JButton) e.getSource();
// 获取按钮上的文本(即按钮的标签)
String command = sourceButton.getText();
// 根据按钮的文本来处理不同的操作
switch (command) {
case "=":
// 如果按钮文本是“=”号,调用 calculateResult 方法来计算并显示结果
calculateResult();
break;
case "Clear":
// 如果按钮文本是“Clear”,清空文本框的内容
expressText.setText("");
break;
default:
// 对于其他按钮(数字和操作符),将按钮的文本追加到表达式文本框中
expressText.setText(expressText.getText() + command);
break;
}
}
// 用于计算最终的结果
private void calculateResult() {
try {
// 获取当前表达式
// 从文本框中获取用户输入的表达式
String expression = expressText.getText();
// 分割数字和操作符
// 按运算符分割表达式,将其拆分为数字部分
// 正则表达式 [+\-*/%^] 匹配所有算术运算符
String[] nums = expression.split("[+\\-*/%^]");
// 按数字分割表达式,将其拆分为运算符部分
// 正则表达式 [0-9.]+ 匹配所有数字和小数点
String[] opers = expression.split("[0-9.]+");
// 检查分割后是否有足够的操作数和运算符
// 确保至少有两个操作数和两个运算符
if (nums.length < 2 || opers.length < 2) {
// 如果操作数或运算符数量不足,显示“输入错误”信息
expressText.setText("输入错误");
return;
}
// 解析操作数和运算符
// 将第一个操作数从字符串转换为 double,并去除多余的空白
double num1 = Double.parseDouble(nums[0].trim());
// 将第二个操作数从字符串转换为 double,并去除多余的空白
double num2 = Double.parseDouble(nums[1].trim());
// 获取运算符,并去除多余的空白
String oper = opers[1].trim();
// 计算结果
// 使用 switch 语句根据运算符计算结果
double result = switch (oper) {
case "+" -> num1 + num2; // 加法运算
case "-" -> num1 - num2; // 减法运算
case "*" -> num1 * num2; // 乘法运算
case "/" -> num2 != 0 ? num1 / num2 : Double.NaN; // 除法运算,除数不能为零
case "%" -> num1 % num2; // 取余运算
case "^" -> Math.pow(num1, num2); // 幂运算
default -> Double.NaN; // 默认情况,结果为 NaN 表示计算错误
};
// 显示结果或错误信息
// 如果结果为 NaN(计算错误),则显示“计算错误”信息
// 否则,将计算结果转换为字符串并显示
expressText.setText(Double.isNaN(result) ? "计算错误" : String.valueOf(result));
} catch (Exception e) {
// 捕获所有异常(例如,输入格式错误或解析错误),并显示“输入错误”信息
expressText.setText("输入错误");
}
// 计算完后清空表达式
// 清空表达式,以便进行新的计算
express = "";
}
}
2.无注释代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator extends JFrame implements ActionListener {
private JTextField expressText;
private JPanel numPanel, operPanel;
private String express = "";
public static void main(String[] args) {
new Calculator("我的计算器");
}
public Calculator(String title) {
super(title);
init();
this.setVisible(true);
this.setSize(300, 300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void init() {
this.setLayout(new BorderLayout());
JPanel topPanel = new JPanel(new BorderLayout());
expressText = new JTextField();
expressText.setEditable(false);
expressText.setBackground(Color.YELLOW);
topPanel.add(expressText, BorderLayout.CENTER);
JButton clearButton = new JButton("Clear");
clearButton.addActionListener(this);
topPanel.add(clearButton, BorderLayout.EAST);
this.add(topPanel, BorderLayout.NORTH);
numPanel = new JPanel(new GridLayout(4, 3));
operPanel = new JPanel(new GridLayout(5, 1));
addButtons(numPanel, operPanel);
this.add(numPanel, BorderLayout.CENTER);
this.add(operPanel, BorderLayout.EAST);
}
private void addButtons(JPanel numPanel, JPanel operPanel) {
String[] numLabels = {"7", "8", "9", "4", "5", "6", "1", "2", "3", "00", "0", "^"};
String[] operLabels = {"+", "-", "*", "/", "="};
for (String label : numLabels) {
JButton button = new JButton(label);
button.addActionListener(this);
numPanel.add(button);
}
for (String label : operLabels) {
JButton button = new JButton(label);
button.addActionListener(this);
operPanel.add(button);
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton sourceButton = (JButton) e.getSource();
String command = sourceButton.getText();
switch (command) {
case "=":
calculateResult();
break;
case "Clear":
expressText.setText("");
break;
default:
expressText.setText(expressText.getText() + command);
break;
}
}
private void calculateResult() {
try {
String expression = expressText.getText();
String[] nums = expression.split("[+\\-*/%^]");
String[] opers = expression.split("[0-9.]+");
if (nums.length < 2 || opers.length < 2) {
expressText.setText("输入错误");
return;
}
double num1 = Double.parseDouble(nums[0].trim());
double num2 = Double.parseDouble(nums[1].trim());
String oper = opers[1].trim();
double result = switch (oper) {
case "+" -> num1 + num2;
case "-" -> num1 - num2;
case "*" -> num1 * num2;
case "/" -> num2 != 0 ? num1 / num2 : Double.NaN;
case "%" -> num1 % num2;
case "^" -> Math.pow(num1, num2);
default -> Double.NaN;
};
expressText.setText(Double.isNaN(result) ? "计算错误" : String.valueOf(result));
} catch (Exception e) {
expressText.setText("输入错误");
}
express = "";
}
}
3.编译成class文件及打包成jar包
1)编译 .java 文件成 .class 文件
- 打开项目: 在 IntelliJ IDEA 中打开你的 Java 项目。
- 配置 JDK:
确保已为项目配置了 JDK。可以通过 File -> Project Structure -> Project 确认和设置。
- 编写代码: 确保你的 .java 文件在 src 目录中。
- 编译项目:
在菜单栏中,选择 Build -> Build Project 或使用快捷键 Ctrl+F9(Windows/Linux)或 Cmd+F9(Mac)。
IntelliJ IDEA 将编译 .java 文件并生成 .class 文件,通常存放在 out 或 target 目录中(取决于项目配置)。
2) 打包成 JAR 包
- 配置 Artifacts:
打开 File -> Project Structure。
选择 Artifacts 标签。
点击左上角的 + 号,选择 JAR -> From modules with dependencies。
选择你的主模块,确保将生成的 .class 文件和所需的依赖项包含在内。
设置输出目录。
- 生成 JAR 包:
配置完成后,点击 Apply 和 OK。
在菜单栏中,选择 Build -> Build Artifacts。
在弹出的菜单中选择你刚刚配置的 JAR 项目,点击 Build。
IntelliJ IDEA 将编译并打包你的项目,生成 JAR 文件在你指定的输出目录中。
结果如图所示