【Java GUI系列:实战一款编辑器之底层接口实现篇】

0 前言

Java GUI系列文章
对于新手来说可以作为
基础练手,对于从职人员来说
实属多余。。。
本文从设计一组通用UI接口出发,实现跨平台
接口穿越,基本设计符合Java SE规范。

1 技术攻关

本通用UI接口采用Java SE设计和开发。

1.1 知识准备

本通用UI接口由于无第三方接口,所以功能单一且不需要复杂的知识。
只需要以下内容。

1.1.1 什么是跨平台

我理解的跨平台不是一次编译到处运行,当然在此基础上,我们就来谈谈
如何实现跨平台,简单来说就是
在自己的平台上定义统一接口,在相应的平台上实现
这是这个通用UI接口的初衷。由于图形界面开发大都大同小异,所以这个通用UI接口
还是有必要单独定义一层。

1.1.2 什么是接口和抽象类

在Java中,接口是一种完美且独有的设计

区别与联系接口抽象类
抽象方法由具体的实现类来实现由继承的子类或者子类的子类来实现
使用方式当更多类具有相同的行为,但大多数的行为单一且差异明显时,接口比较合适当更多类具有相同的行为或者子行为时,抽象类比较合适
通俗说明同种行为不同模式的不同类别之间的统一接口同一类别相同行为之间的个体差异的抽象方法

常用开发模式为定义单一职责的接口,用不同的抽象类实现接口,然后定义一组具体类。

拿通用UI接口来说,
𝟭、我们需要一个具体的绘制行为来绘制控件,但是从控件的形状、颜色、大小等方面看
各控件相应属性差异明显,所以只需定义一个Drawable接口,表明这个接口及其子类具有可描绘行为。
𝟮、在绘制的控件中,有些控件能够包含其他控件,这个时候大多数控件具有获取其父类控件的行为,
因此定义一个抽象Layer类,使其具有getParent行为,表示该类及其子类都具有该行为,同时行为差异不大。

1.1.3 内部类的奇技淫巧

由于Java具有对内部成员权限管理的能力,因此可以灵活管理外部程序中变量
访问该对象中的变量。
一般情况下不需要使用内部类。
有些特殊情况下可以考虑,比如:

𝟭、闭包技术
闭包就是一个封闭的类,这个类只开放仅有的几个方法,它的对象的创建
来自内部或者公开的方法传参产生,产生后对象随着内部数据的变化不再需要
外部数据的干扰。举个例子:

Ⅰ、模拟JVM栈内存数据的管理

Ⅱ、一个子系统使用上层系统的数据

2 接口设计

板块说明
基础函数库基本的控件描绘
基本类图层、布局(容器)、样式类、控件类

2.1 基础函数库

基本的控件描绘。。。

2.2 基本类

提供图层、布局(容器)、样式类、控件类

2.2.1 接口层

𝟭、FDrawable接口

可描绘类事物的统一接口

𝟮、FShape

形状类事物的统一接口

𝟯、FCss(样式类)

样式类,完成对组件的样式设置,类似于Css的功能。

2.2.1 抽象层

𝟭、FLayer

图层类统一超类

𝟮、FLayout

布局(容器)统一超类

3 开发与维护

从项目结构、迭代升级方面开发和维护通用UI底层接口

3.1 项目结构

项目结构

3.2 进度与维护

在进度上,实现三个版本,在维护上分为launch包和发行包。

3.2.1 进度控制

Ⅰ、 版本一
封装通用UI接口层的超类。
Ⅱ、版本二
在Java AWT基础上实现超类的子类。
Ⅲ、版本三
在Android平台上实现超类的子类。

3.3 迭代与升级

以上各版本分别在各自的平台迭代和升级,同时满足版本向后兼容。

3.3.1 Java AWT迭代与升级

迭代和升级次数为两次(迭代一次、升级一次),参考以下表格:

板块周期说明状态
基础函数库第一次Drawable及其相应的spi迭代
基本类第一次图层、布局(容器)、样式类、控件类迭代
基础函数库第二次Drawable的保存升级
基本类第二次图层、布局(容器)、样式类、控件类的保存升级

4 部分源码

𝟭、FDrawable

/*可描绘事物类*/
public interface FDrawable {
    /*描绘该可描绘事物*/
    public FShape doDraw();
    /*根据像素值描绘该可描绘事物*/
    public FShape doDraw(int[][] pixels);
    /*根据选区描绘该可描绘事物*/
    public FShape doDraw(int width,int height);
    /*描绘该可描绘事物前的选区*/
    public void beforeDraw(FShape shape);
}

𝟮、FShape

/*形状类*/
public interface FShape {
    /*填充该形状*/
    public void fill();

    /*描画该形状*/
    public void stroke();

    /*获取该形状的数据*/
    public Object getData();
}

𝟯、FStyle

/*画笔与填充样式类*/
public class FStyle {
    /*颜色*/
    public int color;

    /*渐变模式*/
    public String gradient;

    /*图片填充模式*/
    public String pattern;
    
}

5 使用案例

𝟭、FComponentExample

public class FComponentExample {
    public static void main(String[] args) {
        FLayerGroup layout = new FLayerGroup(10,10);
        FComponent child1 = new FComponent();
        layout.add(child1);

        FFrame frame = new FFrame(20,100);
        frame.setContent(layout);
    }
}

FComponentExample

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JDK小分队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值