【Java SE基础系列之GUI领域文献:统一图形界面接口】

0 前言

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

1 技术攻关

基于Java SE设计和开发的统一图形界面接口

1.1 知识准备

本统一图形界面接口由于无第三方接口,所以功能单一且不需要复杂的知识。
只需要以下内容。

1.1.1 图形界面基本概念

图形用户界面(GUI) 是通过视觉元素(窗口、按钮、图标等)实现人机交互的界面形式
核心特点包括:

  1. 组件化结构:由基础控件(按钮/文本框)和容器(窗口/面板)构成
  2. 事件驱动模型:用户操作触发事件响应(如点击按钮执行操作)
  3. 平台抽象层:通过AWT(抽象窗口工具包)屏蔽操作系统差异
    在Java生态中:
    • Java SE:提供基础GUI开发能力(Swing/JavaFX)
    • Java EE:企业级扩展,支持Web界面开发
1.1.2 SPI技术的工作原理及实现机制

SPI(Service Provider Interface,服务提供者接口)是Java平台中一种重要的服务发现机制,
它允许在运行时动态加载和替换服务实现,从而实现框架或库的扩展点。
其核心思想是面向接口编程,通过解耦调用方和服务提供方,提升系统的灵活性和可扩展性。

1.2 咨询与合作

Ⅰ、基于本接口的图形界面开发
Ⅱ、基于本接口的二次开发,如丰富图形界面元素、提供跨平台元素转化接口

2 整体设计

├── Layer(所有可视图层的基类)
│   ├── FButton, FLabel, FText...(基本组件)
│   └── LayerGroup(容器基类)
│       ├── LinearLayout(线性布局)
│		├── GridLayout(表格布局)
│		├── GridBagLayout(网格布局)
│		└── FWindow
│            ├── FFrame(主窗口)
│            └── FDialog(对话框)
└── Style(样式类的基类)
    ├── BorderStyle(边框样式)
    ├── BoxStyle(盒子样式)
	└── TextStyle(文本样式)
		└── ParagraphStyle(段落样式)

2.1 接口设计

板块说明
基础函数库图层布局计算函数
基本类图层、布局(容器)、样式类、控件类
扩展类与其他图形界面的适配

2.1 基础函数库

图层布局计算函数。。。

public void onLayout2Page
(boolean change,int left,int top,
     int right,int bottom) {
	 
 }

界面元素构造函数。。。

2.2 基本类

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

3 开发与维护

从项目结构、迭代升级方面开发和维护本接口

3.1 项目结构

├── resouce(源码软件包)
│   ├── Layer, LayerGroup, Style,OnStyleListener...(基本组件)
│   └── spi(生成器软件包)
│       ├── LayoutProvider(布局类提供器)
│		├── LayerProvider(图层类提供器)
│		└── StyleProvider(样式提供器)
│		    
├── launch
└── test(测试软件包)
	└── example
		├── LayoutExample(布局测试类)
		├── LayerExample(图层测试类)
		└── StyleExample(样式测试类)

3.2 进度与维护

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

3.2.1 进度控制

Ⅰ、 版本一

封装本接口的所有超类和实现类。

Ⅱ、版本二

实现用xml文件实例化图形界面。

Ⅲ、版本三

适配和转化第三方图形界面元素。

3.3 迭代与升级

以上各版本需满足版本向后兼容。

3.3.1 界面元素类迭代与升级

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

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

4 部分源码

  1. Layer类
package org.baseui;

public class Layer {
    private  int id;
    protected LayerGroup parent;
    protected Style style;
    protected  int width;
    protected int height;

    public LayerGroup getParent() {
        return parent;
    }

    public void setParent(LayerGroup parent) {
        this.parent = parent;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setStyle(Style style) {
        this.style = style;
    }

    public Style getStyle() {
        return style;
    }


    public void onLayout2Page(boolean change,int left,int top,
                              int right,int bottom) {
        Object[] attrs = style.getAttributes(new String[]{
             Style.AttributeName.WIDTH,
                Style.AttributeName.HEIGHT,
                Style.AttributeName.WEIGHT
        });
        int _width = (int)attrs[0];int _height = (int)attrs[1];
        int[] _weight = (int[])attrs[2];

        if(_width==0&&_height!=0) {
            _width = right*_weight[0]/_weight[1];
            this.width = _width;
        }

        if((_width!=0)&&_height==0) {
            _height = bottom*_weight[0]/_weight[1];
            this.height = _height;
        }
        System.out.println("x:"+left+",y:"+top+",width:"+_width+",height:"+_height);
    }

    public void layout2Page(int left,int top,
                              int right,int bottom) {
        onLayout2Page(true,left,top,right,bottom);
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }
}

  1. Style接口
package org.baseui;

public interface Style {
    public Object[] getAttributes(String[] names);
    public <T> void setAttribute(String name,T value);
    public <T> T getAttribute(String name,Class<T> type);
    public Style getCurrentStyle();
    public void setCurrentStyle(Style style);

    public static class AttributeName {
        public final static String X = "x";
        public final static String Y = "y";
        public final static String WIDTH = "width";
        public final static String HEIGHT= "height";
        public final static String WEIGHT= "weight";
        public final static String ALIGNMENT= "alignment";
        public final static String MARGIN_LEFT = "marginLeft";
        public final static String MARGIN_TOP = "marginTop";
        public final static String MARGIN_RIGHT = "marginRight";
        public final static String MARGIN_BOTTOM = "marginBottom";
        public final static String PADDING_LEFT = "paddingLeft";
        public final static String PADDING_TOP = "paddingTop";
        public final static String PADDING_RIGHT = "paddingRight";
        public final static String PADDING_BOTTOM = "paddingBottom";
        public final static String BACKGROUND_COLOR = "backgroundColor";
        public final static String BORDER_COLOR = "borderColor";
        public final static String BORDER_WIDTH = "borderWidth";
        public final static String ARCWIDTH = "arcWidth";
        public final static String ARCHEIGHT = "arcHeight";
        public final static String BORDER_STYLE = "borderStyle";
    }
}

5 联系我们

Q:3374267705 敬请关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JDK小分队

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

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

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

打赏作者

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

抵扣说明:

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

余额充值