![ac5af7cf9aa19672b69e0bda5bc6781e.png](https://img-blog.csdnimg.cn/img_convert/ac5af7cf9aa19672b69e0bda5bc6781e.png)
matlab的GUIDE提供了非常便利的开发工具,能够高效的开发出图形用户界面,但是相对于java而言,功能还略显简单。如何在matlab中利用java的标准库进行GUI开发,并充分利用两者的优势,在matlab环境下编写出更加炫酷的应用界面,满足不同用户和老板的要求,是一个简单的工程问题,但是能找到答案的地方很少。下面介绍一下本人在工程实践中,摸索出的在matlab中应用java标准库进行GUI设计的例子,给大家提供一些参考和帮助。
具体设计需求的提出:如何设计一个不带边框的图形窗体,就像matlab和eclipe启动画面那样,同时,还要能进行鼠标控制?如下图:
![35477bdfd68256db24f32b542da0b96a.png](https://img-blog.csdnimg.cn/img_convert/35477bdfd68256db24f32b542da0b96a.png)
我们希望得到的应用程序画面(还要能通过鼠标进行控制):
![d2c7e904ac0c541a174d08814f3cca64.png](https://img-blog.csdnimg.cn/img_convert/d2c7e904ac0c541a174d08814f3cca64.png)
采用标准的matlab的GUI设计的画面(能够通过鼠标进行控制,但是有边框,不好看,还容易被拖放到任意位置):
![3c4c3afbf1dcee924f88c47237ca3ec4.png](https://img-blog.csdnimg.cn/img_convert/3c4c3afbf1dcee924f88c47237ca3ec4.png)
如何实现无边框的窗体显示呢?
具体思路为:利用java.swing.JFrame的实例的undecorated()属性,去掉窗体的外框,同时还要利用窗体监控到的鼠标动作回调函数,来进行控制。存在的问题是matlab提供figure没有undecorated()属性,不能去除边框,而能去除边框的java.swing.JFrame对象要监听鼠标动作还要用到addMouseListener()等很多监听器,并要改写标准类的动作响应,在matlab中编写比较繁琐和麻烦。解决的方法:利用网络上找到的uicomponent()函数(开发者Yair Altman)来创建出同时具有java属性和uicontrol属性的窗体元件(不是组件也不是控件了)。方便的设置其属性。
具体代码:
1.主程序
% 量化交易启动界面
% 采用了java图形界面设计和matlab图形界面设计的优点
import javax.swing.*; % 导入java类
import java.awt.*; % 导入java类
close all;
clear;
% --------------------- 创建题目标签 ---------------------------------------
lj = javax.swing.JLabel('小钻风量化交易系统'); % 得到标签3的对象
lj.setHorizontalAlignment(SwingConstants.CENTER); % 设置标签3居中
lj.setForeground(color.green); % 设置标签3前景色
lj.setOpaque(false); % 设置标签3透明度
lj.setFont(Font('隶书',Font.BOLD,32)); % 设置标签3字体
lj.setBounds(140,30,330,50); % 设置标签的显示范围
% -------------------- 创建两个图形标签 ------------------------------------
ImageFile = 'universityPic1.jpeg'; % 设置图片1文件名
ImageFile1 = 'goldencity.jpg'; % 设置图片2文件名
jImage = im2java(imread(ImageFile)); % 将读入图形转化为java格式
jImage1 = im2java(imread(ImageFile1)); % 将读入图形1转化为java格式
icon = javax.swing.ImageIcon(jImage); % 得到java图形图表对象
icon1 = javax.swing.ImageIcon(jImage1);
scale1 = icon.getImage().getScaledInstance(200,150,Image.SCALE_DEFAULT); % 设置图形缩放功能
scale2 = icon1.getImage().getScaledInstance(200,150,Image.SCALE_DEFAULT);
icon.setImage(scale1); % 设置图片
icon1.setImage(scale2);
label = javax.swing.JLabel(icon); % 得到java标签的实例对象1
label1 = javax.swing.JLabel(icon1); % 得到java标签的实例对象2
label.setBounds(80,100,200,150); % 设置标签1的显示范围
label1.setBounds(320,100,200,150); % 设置标签2的显示范围
% -------------------- 创建窗体的题目标签 ----------------------------------
lb1 = javax.swing.JLabel('量化交易策略开发平台'); % 创建文字标签1
lb1.setBounds(120,280,140,50); % 设置文字标签1的位置
lb1.setForeground(Color.gray); % 设置文件标签1的颜色
lb1.setFont(Font('宋体',Font.PLAIN,14)); % 设置文字标签1的字体
lb2 = javax.swing.JLabel('实盘运行监控程序'); % 设置文字标签2的位置
lb2.setBounds(380,280,140,50); % 设置文字标签2的位置
lb2.setForeground(Color.gray); % 设置文字标签2的颜色
lb2.setFont(Font('宋体',Font.PLAIN,14)); % 设置文字标签2的字体
% ------------------ 创建退出按钮 ------------------------------------------
bt1 = javax.swing.JLabel('退出系统'); % 创建退出按钮
bt1.setBounds(480,340,80,20); % 设置按钮的位置
bt1.setForeground(color.red);
bt1.setBackground(Color.gray);
bt1.setFont(Font('宋体',Font.PLAIN,14));
% -------------------- 在主窗体容器中加入java组件 --------------------------
frame = uicomponent('style','javax.swing.JFrame',... % 创建具有matlab属性的java窗体
'positon',[550 350 600 400],... % 设置窗体的显示位置
'Undecorated',1,... % 去掉窗体的边框
'MouseClickedCallback',{@mouseTick}); % 设置窗体的鼠标单击回调函数
fig = get(frame,'Parent'); % 得到uicomponent产生的figure句柄
set(fig,'Visible','off','position',[550 350 600 400]); % 隐藏figure窗体
contentpane = get(frame,'ContentPane'); % 得到窗体的容器
contentpane.setBackground(color.black); % 设置容器的颜色
contentpane.add(lj); % 容器加入标签组件
contentpane.add(label);
contentpane.add(label1);
contentpane.add(lb1);
contentpane.add(lb2);
contentpane.add(bt1);
clear;
close all;
2.鼠标响应回调函数
% windows下鼠标单击处理回调函数
function mouseTick(hObject,~)
location = get(0,'PointerLocation'); % 得到鼠标的位置
% ------------- 退出按钮 -----------------------------------------------
if location(1) > 1030 && location(1) < 1086 && ...
location(2) > 390 && location(2) < 415
hObject.dispose; % 关闭窗体
close all;
end
% ------------- 开发平台图 ---------------------------------------------
if location(1) > 637 && location(1) < 830 && ...
location(2) > 500 && location(2) < 640
hObject.dispose;
close all;
FinanceSystemLogin; % 调用开发平台程序
end
% ------------ 实时监控图 ---------------------------------------------
if location(1) > 873 && location(1) < 1066 && ...
location(2) > 500 && location(2) < 640
hObject.dispose;
close all;
realRunControl_1; % 调用实时监控程序
end
end
关键语句:
frame = uicomponent('style','javax.swing.JFrame',...
'positon',[550 350 600 400],...
'Undecorated',1,...
'MouseClickedCallback',{@mouseTick});
创建了matlab的不带边框并具有鼠标单击回调函数的窗体。
contentpane = get(frame,'ContentPane');
得到窗体的容器,可以加入不同的java组件了。
location = get(0,'PointerLocation');
调用图形根对象0的'PointerLocation'属性得到鼠标在屏幕上的任意点的位置。
set(fig,'Visible','off','position',[550 350 600 400]);
因此由uicomponent()自动创建的figure1。
至于uicomponent()函数的用法,其使用了uicontrol()函数和未公开授权的javacomponent()函数,这里不再赘述,提供附件源代码uicomponent.m,供参考学习。
后续,还会介绍修改matlab的figure窗体左上角的图标的方法,一句话就可以实现,非常方便...