前言
最近做的一个需求,有个逻辑环节是:需要从本地保存的xml文件中取出一个值,这个值是会变化的。然后项目经理就给我说,你能不能做一个小工具,让用户可以直接通过界面化操作将这个变化的值写入文件,不用再去找文件路径,在编辑这个文件? 我的第一反应竟然是,不想搞。但也不是不能、使用JFrame就可以实现。
1、JFrame 简介
JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。
Swing 的三个基本构造块:标签、按钮和文本字段;但是需要个地方安放它们,并希望用户知道如何处理它们。JFrame 类就是解决这个问题的——它是一个容器,允许程序员把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。 JFrame 实际上不仅仅让程序员把组件放入其中并呈现给用户。比起它表面上的简单性,它实际上是 Swing 包中最复杂的组件。为了最大程度地简化组件,在独立于操作系统的 Swing 组件与实际运行这些组件的操作系统之间,JFrame 起着桥梁的作用。JFrame 在本机操作系统中是以窗口的形式注册的,这么做之后,就可以得到许多熟悉的操作系统窗口的特性:最小化/最大化、改变大小、移动。
构造方法
只给出部分,本案例要用到的,更多方法请查询官网资料
JFrame() | 构造一个初始时不可见的新窗体。 |
JFrame(String title) | 创建一个新的、初始不可见的、具有指定标题的 Frame。 |
2、实现步骤:
- 1、新建Java类
- 2、声明三控件【定义三个组件JLabel、JTextField和JButton】
JLabel jlabel;
JTextField jtf1;
JButton jb1, jb2;
- 3、添加面板【定义个JPanel控件,然后依次将控件添加到JPanel上】
pane = new JPanel();
pane.setBounds(10, 10, 400, 300);
pane.setLayout(null);
jlabel = new JLabel("设备主秘匙:");
jlabel.setBounds(30, 40, 80, 30);
jtf1 = new JTextField();
jtf1.setBounds(110, 40, 260, 30);
pane.add(jlabel);
pane.add(jtf1);
- 4、窗口加控件
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
-
5、实例化对象
-
6、保存并运行
3、完整代码
以下是一个小案例,可以仿照这个案例改写。
主要关注的点:
1、如何制作出来这个窗体?
2、如何获取用户输入的内容?
只有拿到了用户输入的值,才可以进一步操作。
/**
* @author zyz
* @version 1.0
* @data 2023/7/16 15:06
* @Description: 使用java制作一个窗体,用来收集用户输入的内容
*/
public class Form extends JFrame {
JLabel jlabel;
JTextField jtf1;
JButton jb1, jb2;
JPanel pane;
private String PackageConfig = "";
private String MainKey = "";
public String getMainKey() {
return MainKey;
}
public void setMainKey(String mainKey) {
MainKey = mainKey;
}
public String getPackageConfig() {
return this.PackageConfig;
}
public void setPackageConfig(String packageConfig) {
this.PackageConfig = packageConfig;
}
/**
* 构造函数
*
* @param title
*/
public Form(String title) {
super(title);
this.getContentPane().setLayout(null);
this.setBounds(500, 500, 460, 460);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pane = new JPanel();
pane.setBounds(10, 10, 400, 300);
pane.setLayout(null);
jlabel = new JLabel("设备主秘匙:");
jlabel.setBounds(30, 40, 80, 30);
jtf1 = new JTextField();
jtf1.setBounds(110, 40, 260, 30);
pane.add(jlabel);
pane.add(jtf1);
jb1 = new JButton("保存");
jb1.setBounds(130, 100, 70, 30);
pane.add(jb1);
jb2 = new JButton("取消");
jb2.setBounds(220, 100, 70, 30);
pane.add(jb2);
this.add(pane);
/**
* 处理文本内容
* true 包含中文字符 false 不包含中文字符
*/
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//正则表达式
Pattern p = Pattern.compile("[\u4E00-\u9FA5|\\!|\\,|\\。|\\(|\\)|\\《|\\》|\\“|\\”|\\?|\\:|\\;|\\【|\\】]");
String inputMainKey = jtf1.getText().trim();
if (jtf1.getText().trim().length() == 0) {
JOptionPane.showMessageDialog(null, "输入内容不能为空!!!");
} else {
Matcher m = p.matcher(inputMainKey);
if (m.find()) {
JOptionPane.showMessageDialog(null, "输入内容不合法,应该为数字+英文组合!!!");
} else {
JOptionPane.showMessageDialog(null, "修改成功!!!");
}
}
}
});
this.setVisible(true);
}
public static void main(String[] args) {
Form c = new Form("修改主秘匙的值");
}
}
4、实现效果
页面可能比较丑,但是能用。页面布局可以根据自己需求设计。
对输入的内容校验,
5、后语
我要做成的是,要将用户输入的数据经过加密处理后保存到本地的xml文件,同时需要根据不同的系统,修改不同路径下的文件。我还需要将这个编写的java工具,打包成jar包。做成用户可以直接点击运行出来。同时还需要考虑,加入用户系统未安装jdk或者jre,还要考虑这个问题,还好公司项目,已经包含了jdk。我只需要编写一个bat脚本,将j路径指向项目中jdk的路径就可以。
提示:如果项目中使用到了自己引入的第三方jar包,一定要确保引入的jar包打入最终的项目jar包中【可以使用IDEA自带的打包工具,也可以使用maven进行打包】。否则在运行jar包的时候会报类找不到的问题。
具体打包参考这篇博客:Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行