java rectangle对象 去掉边框_matlab中调用java类进行GUI设计的实例

ac5af7cf9aa19672b69e0bda5bc6781e.png

matlab的GUIDE提供了非常便利的开发工具,能够高效的开发出图形用户界面,但是相对于java而言,功能还略显简单。如何在matlab中利用java的标准库进行GUI开发,并充分利用两者的优势,在matlab环境下编写出更加炫酷的应用界面,满足不同用户和老板的要求,是一个简单的工程问题,但是能找到答案的地方很少。下面介绍一下本人在工程实践中,摸索出的在matlab中应用java标准库进行GUI设计的例子,给大家提供一些参考和帮助。

具体设计需求的提出:如何设计一个不带边框的图形窗体,就像matlab和eclipe启动画面那样,同时,还要能进行鼠标控制?如下图:

35477bdfd68256db24f32b542da0b96a.png
matlab启动画面,没有控制功能

我们希望得到的应用程序画面(还要能通过鼠标进行控制):

d2c7e904ac0c541a174d08814f3cca64.png

采用标准的matlab的GUI设计的画面(能够通过鼠标进行控制,但是有边框,不好看,还容易被拖放到任意位置):

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窗体左上角的图标的方法,一句话就可以实现,非常方便...

uicomponent.m
34.3K
·
百度网盘
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值