0 前言
Java GUI系列文章
对于新手来说可以作为
基础练手,对于从职人员来说
实属多余。。。
本文从设计一组统一图形界面接口出发,实现跨平台
接口穿越,基本设计符合Java SE规范
1 技术攻关
基于Java SE设计和开发的统一图形界面接口
1.1 知识准备
本统一图形界面接口由于无第三方接口,所以功能单一且不需要复杂的知识。
只需要以下内容。
1.1.1 图形界面基本概念
图形用户界面(GUI) 是通过视觉元素(窗口、按钮、图标等)实现人机交互的界面形式
核心特点包括:
- 组件化结构:由基础控件(按钮/文本框)和容器(窗口/面板)构成
- 事件驱动模型:用户操作触发事件响应(如点击按钮执行操作)
- 平台抽象层:通过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 部分源码
- 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;
}
}
- 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 敬请关注