JFormDesigner的个人使用习惯分享

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,那么这些就是我要分享的内容了。谢谢你读完了我的文章,如果有什么意见可以在评论区提出来,欢迎交流✨。

分享这篇文章