WindowBuilder入门:使用swt的canvas类构造显示URL图像
时间:2022-06-22
本文章向大家介绍WindowBuilder入门:使用swt的canvas类构造显示URL图像,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/53377864
首先如创建一个基于于Canvas的ImageCanvas类,ImageCanvas.java
package net.gdface.ui;
import java.net.URL;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.wb.swt.SWTResourceManager;
public class ImageCanvas extends Canvas {
// 显示的图像
private Image image;
// 图像缩放比例
private float zoom=1f;
/**
* @param parent
* @param style
* @param image 显示的图像,为null时不显示
*/
public ImageCanvas(Composite parent, int style, Image image) {
super(parent, style);
this.image = image;
addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
// 调用重绘方法
paintImage(e.gc);
}
});
}
/**
* @wbp.parser.constructor
*/
public ImageCanvas (Composite parent, int style, URL url){
this(parent,style,SWTResourceManager.getImage( url));
}
/**
* 重绘图像,窗口区域变化时都重新计算适合的显示位置,以保证图像居中完整显示
* @param gc
*/
protected void paintImage(GC gc) {
if(null==image)return;
zoom=fitZoom();
Rectangle rect=getPaintRect();
gc.drawImage(image, 0, 0, image.getBounds().width, image
.getBounds().height, rect.x, rect.y, rect.width,
rect.height);
}
/**
* 返回适合当前窗口尺寸完整显示图像的缩放比例,图像长宽都小于显示窗口时,则返回1
* @return
*/
private float fitZoom(){
Point size = getSize();
Rectangle imgSize= image.getBounds();
if(imgSize.width<size.x&&imgSize.height<size.y)return 1f;
if(imgSize.width*size.y<imgSize.height*size.x){
return (float)size.y/imgSize.height;
}
return (float)size.x/imgSize.width;
}
/**
* 根据图像缩放比例返回图像在gc中的显示区域(居中显示)
* @return
*/
private Rectangle getPaintRect(){
Point size = getSize();
Rectangle imgSize= image.getBounds();
if(zoom>0){
imgSize.width*=zoom;
imgSize.height*=zoom;
}
imgSize.x=(size.x-imgSize.width)/2;
imgSize.y=(size.y-imgSize.height)/2;
return imgSize;
}
@Override
public void dispose() {
super.dispose();
image.dispose();
}
}
然后如下图用WindowBuilder创建一个TestDialog类
然后在生成的TestDialog类的createContents中将ImageCanvas对象加入对话框 TestDialog.java
package testwb;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.swt.SWT;
import org.eclipse.wb.swt.SWTResourceManager;
import net.gdface.ui.ImageCanvas;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.PaintEvent;
public class TestDialog extends Dialog {
protected Object result;
protected Shell shell;
private ImageCanvas canvas;
/**
* Create the dialog.
* @param parent
* @param style
*/
public TestDialog(Shell parent, int style) {
super(parent, style);
}
/**
* Open the dialog.
* @return the result
*/
public Object open() {
createContents();
shell.open();
shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
/**
* Create contents of the dialog.
*/
private void createContents() {
shell = new Shell(getParent(), SWT.NONE);
shell.setSize(450, 300);
shell.setText(getText());
// 将mageCanvas对象加入Dialog
try {
canvas = new ImageCanvas(shell, SWT.NONE,SWTResourceManager.getImage(new URL("http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg")));
canvas.setBounds(23, 21, 254, 241);
} catch (MalformedURLException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
//
}
}
然后在org.eclipse.wb.swt.SWTResourceManager.java中增加支持URL的getImage方法
public static Image getImage(URL url) {
Image image = m_imageMap.get(url.toString());
if (image == null) {
try {
image = getImage(url.openStream());
m_imageMap.put(url.toString(), image);
} catch (Exception e) {
image = getMissingImage();
m_imageMap.put(url.toString(), image);
}
}
return image;
}
现在,在WindowBuilder的design设计视图中就能看到效果了
JUnit测试代码 TestCanvas.java
package iadbui;
import org.eclipse.swt.widgets.Shell;
import org.junit.Test;
import testwb.AnnDialog;
public class TestCanvas {
@Test
public void test() {
new AnnDialog(new Shell(),0).open();
}
}
- Day4下午解题报告
- linux下 Error running javac compiler
- 讨厌算法的程序员 1 - 插入排序
- Linux下使用ssh密钥实现无交互备份
- [编程经验] Python中的continue和break语句
- 洛谷 P3386 【模板】二分图匹配 Dinic版
- [编程经验] 拉勾网爬虫数据的后续处理
- Linux下使用rsync实现文件备份
- 【干货】基于TensorFlow卷积神经网络的短期股票预测
- [编程经验] 基于bs4的拉勾网AI相关工作爬虫实现
- [编程经验] 链家23个全国主要城市的现房数据分析
- [编程经验] Python中的modlue和packages的区别
- Day5上午解题报告
- [编程经验] Pandas中比较好用的几个方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端周卡——第一周
- Go语言(十二)web编程
- Go语言入门(十一) 接口编程
- 一个价值百万的思路,如何下载去水印视频
- Go语言入门(十) Mysql与Redis操作
- 【Vue进阶】——如何实现组件属性透传?
- Go语言入门(九) 文件操作
- zookeeper完整详细版
- redis学习(十九)
- Android开发6年,互联网寒冬公司倒闭后,耗时3个月北上广求职,终拿到头条Offer!
- 直播软件开发如何使用FFMPEG推流并保存在本地
- react-router学习笔记
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- BFE.dev前端刷题 23. 实现一个sum()方法
- 彻底深刻理解js原型链之prototype,proto以及constructor(一)