JFormDesigner的个人使用习惯分享
java client
这个插件主要问题就是网上的教程太少了。而且这个插件付费。
下面是我使用JFormDesigner开发的项目的项目结构
上面画红框的就是使用插件生成的文件。
创建窗口的方式很简单,就右键 -> New -> JFormDesinger Form 创建窗口或者其他组件的时候我通常使用BoxLayout并且以y轴排列,我认为这样布局更方便
新建完后,就可以点击.jfd文件开始布局了。个人认为插件只用来布局和绑定事件,不要用来去搞数据绑定之类的东西,很麻烦。
然后我们就可以来编写自己的代码了
我们先来理一下,一个完整的swing程序需要解决什么主要问题:
- 窗口布局
- 窗口中的逻辑
- 窗口与窗口之间的路由
窗口布局解决了,下面就是窗口逻辑和窗口与窗口之间的路由。
public class SchoolFrame extends JFrame {
CommonUtils commonUtils;
// 构造方法,可以改
public SchoolFrame() {
initComponents();
commonUtils = new CommonUtils(
new String[]{
"编号",
"学校名称",
"学校官网",
"地址",
"学校类型"
},
"school",
table
);
commonUtils.render();
}
// 绑定的事件方法,也可以改
private void add(ActionEvent e) {
Main.onAddSch();
}
// 自己写的方法,也可以改
private void doSomething() {
}
private void search(ActionEvent e) {
commonUtils.setKey(key.getText().trim());
commonUtils.render();
}
private void back(ActionEvent e) {
Main.back(this);
}
// 下面是自动生成的代码,不用改。改了也没有用,会自动恢复
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
……略……
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// 下面也是自动生成的代码,不用改。改了也没有用,会自动恢复
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
……略……
// JFormDesigner - End of variables declaration //GEN-END:variables
}
接下来的问题是我们这么让这个项目运行起来,这里我的方法是用到一个主启动类Main
public class Main {
static SchoolFrame schoolFrame;
static SubjectFrame subjectFrame;
public static Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize();
public static Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
public static void main(String[] args) {
initSystem();
}
public static void initSystem() {
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(5),
new ThreadPoolExecutor.AbortPolicy()
);
// 初始化连接操作
CompletableFuture.supplyAsync(JDBCUtils::initCon, threadPool).whenComplete((v, e) -> {
// 获取数据库连接成功
if(e == null) {
JDBCCons.connection = v;
subjectFrame = new SubjectFrame();
schoolFrame = new SchoolFrame();
// 配置窗口位置及其大小
schoolFrame.setBounds(
p.x - (int) (SCREEN_SIZE.getWidth() / 3),
p.y - (int) (SCREEN_SIZE.getHeight() / 3),
(int) (SCREEN_SIZE.getWidth() / 1.5),
(int) (SCREEN_SIZE.getHeight() / 1.5)
);
subjectFrame.setBounds(
p.x - (int) (SCREEN_SIZE.getWidth() / 3),
p.y - (int) (SCREEN_SIZE.getHeight() / 3),
(int) (SCREEN_SIZE.getWidth() / 1.5),
(int) (SCREEN_SIZE.getHeight() / 1.5)
);
// 展示窗口
schoolFrame.setVisible(true);
}
}).exceptionally(e -> {
// 异常处理
e.printStackTrace();
return null;
});
}
}
现在还有一个问题是页面之间的路由,我这里使用了setVisible方法来模拟路由操作。假设我们有这么一个需求:从schoolFrame页面路由至subjectFrame。如果是我的话,会这么做:
由于上面的代码已经实例化完毕静态的subjectFrame了,我们只需要调用setVisible来模拟路由
// 先在Mian中创建方法
public static void toSubjectFrame(JFrame frame) {
frame.setVisible(false);
subjectFrame.setVisible(true);
}
// 在School绑定的促发事件中调用方法
public void chilkToSubjectFrameButton(ActionEvent e) {
Main.toSubjectFrame(this);
}
ok,那么这些就是我要分享的内容了。谢谢你读完了我的文章,如果有什么意见可以在评论区提出来,欢迎交流✨。
分享这篇文章