效果图:
为了在SWT中实现像Windows桌面图标那样的效果,自定义了一个控件,该控件继承自org.eclipse.swt.widgets.Composite,由一个缩略图标(CLabel)和一个图标名称(Label)构成。
缩略图是由图片文件提供,并缩放到固定尺寸。
创建该控件需要向其构造函数传递一个Image和String,分别是缩略图的原图和即将在图标下方显示的名称。
控件的代码如下,很简单:
import java.io.File;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class Thumbnails extends Composite {
private CLabel cLabelImage;
private Image image;
private Label label;
private String labelText;
private final int IMAGE_SIZE = 164;//缩放后的图片最长的边长为定值。
/**
* 对外使用的构造函数。
* @param parent
* @param style
* @param image
* @param labelText
*/
public Thumbnails(Composite parent, int style, Image image, String labelText) {
super(parent, style);
this.image = image;
this.labelText = labelText;
initGUI();
}
private void initGUI() {
GridData data = new GridData ();
data.widthHint = 170;
data.heightHint = 180;
this.setLayoutData(data);
try {
GridLayout thisLayout = new GridLayout();
this.setLayout(thisLayout);
{
GridData cLabelImageGridData = new GridData();
cLabelImageGridData.horizontalAlignment = GridData.FILL;
cLabelImageGridData.verticalAlignment = GridData.FILL;
cLabelImageGridData.grabExcessVerticalSpace = true;
cLabelImageGridData.grabExcessHorizontalSpace = true;
cLabelImage = new CLabel(this, SWT.NONE);
cLabelImage.setLayoutData(cLabelImageGridData);
// cLabelImage.setImage(this.image);
cLabelImage.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent evt) {
cLabelImagePaintControl(evt);
}
});
}
{
label = new Label(this, SWT.NONE);
GridData labelGridData = new GridData();
labelGridData.horizontalAlignment = GridData.CENTER;
label.setLayoutData(labelGridData);
label.setText(this.labelText);
}
this.layout();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 缩放图片
* @param evt
*/
private void cLabelImagePaintControl(PaintEvent evt) {
Rectangle bounds = image.getBounds();
int imageWidth = bounds.width;
int imageHeight = bounds.height;
int thumbWidth = IMAGE_SIZE;// TODO: 缩放后的图片最大宽度
int thumbHeight = IMAGE_SIZE;// TODO: 缩放后的图片最大高度
double ratio = (double)imageWidth/(double)imageHeight;
//若宽大于高
if(ratio>(double)1){
thumbHeight = (int)(thumbWidth/ratio);
}else {
thumbWidth = (int)(thumbHeight*ratio);
}
// 如果图片小于所略图大小, 不作处理
if (imageWidth < IMAGE_SIZE && imageHeight < IMAGE_SIZE) {
thumbWidth = imageWidth;
thumbHeight = imageHeight;
}
evt.gc.drawImage(image, 0, 0, bounds.width, bounds.height, 0, 0,
thumbWidth, thumbHeight);
// evt.gc.drawImage(image, srcX, srcY, srcWidth, srcHeight, destX, destY, destWidth, destHeight)
}
@Override
public void addMouseListener(MouseListener listener) {
super.addMouseListener(listener);
//这样在点击图标或标题的时候,整个控件才能被选中。
cLabelImage.addMouseListener(listener);
label.addMouseListener(listener);
}
@Override
public void dispose() {
if(null !=image && !image.isDisposed()){
image.dispose();
}
if(null !=cLabelImage && !cLabelImage.isDisposed()){
cLabelImage.dispose();
}
if(null !=label && !label.isDisposed()){
label.dispose();
}
super.dispose();
}
/**********************************以下代码用于测试SWT控件,实际使用中不会调用*********************************/
/**
* Auto-generated main method to display this
* org.eclipse.swt.widgets.Composite inside a new Shell.
*/
public static void main(String[] args) {
showGUI();
}
/**
* Auto-generated method to display this org.eclipse.swt.widgets.Composite
* inside a new Shell.
*/
public static void showGUI() {
Display display = Display.getDefault();
Shell shell = new Shell(display);
File imageFile = new File("D:\\sb.jpg");
Image localImage = null;
if (imageFile.exists()) {
ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile(
null, imageFile.getAbsolutePath());
localImage = imageDescriptor.createImage();
}
Thumbnails inst = new Thumbnails(shell, SWT.NULL, localImage, "hello");
Point size = inst.getSize();
shell.setLayout(new FillLayout());
shell.layout();
if (size.x == 0 && size.y == 0) {
inst.pack();
shell.pack();
} else {
Rectangle shellBounds = shell.computeTrim(0, 0, size.x, size.y);
shell.setSize(shellBounds.width, shellBounds.height);
}
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
- 大小: 53.5 KB
分享到:
相关推荐
java swt自定义控件java swt自定义控件java swt自定义控件java swt自定义控件
SWT/JFACE的控件库毕竟有限,在应用开发是我们不可避免地要自己开发一些自定义的控件
SWT自带的DateTime控件属实不好用,而且无法绑定到其他控件上。因此自己写一个日历控件用着方便,功能大致如下: 1、日历控件可自定义设置常见的几种日期格式; 2、可以绑定注册到其他控件如:文本框、按钮、标签上...
NULL 博文链接:https://salever.iteye.com/blog/719528
SWT提供的标准组件毕竟有限,很多时候我们都需要自定义组件。本文介绍了自定以SWT组件的方法,可以创建独立的也可以创建复合的。 文章 地址 : ...
个人兴趣做的swt小软件,可用来背单词,但苦于没有词库只弄了个6级高频……如果熟悉xml,也可以自建词库,但名称必须不能是中文的。 互相学习互相分享,欢迎赐教。 另有该软件的日语版,不知道有没人下载,暂不上传...
Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...
对于swt控件知识的部分整理,有助于对其的学习。
NULL 博文链接:https://liuxiaobin1023-163-com.iteye.com/blog/1144212
在eclipse中使用SWT自定义控件的例子,适合初学者
只要swt一个jar包即可,无需jacob,jna,jni等等,方法很简单
swt自定义封装的日期时间选择控件,支持选择日期和时间
数据融合matlab代码2D-DWT_SWT- 在安装和应用之前请先阅读以下内容: 算法应用平台 这些代码在MATLAB R2016b下可以完美运行,同时也可以在更高版本的MATLAB下运行。 这些代码使用MATLAB工具来读取输入数据和结果说明...
SWT原生按钮不够美观,本案例实现自定义圆形按钮,代码可直接下载使用。
SWT 第三方 date picker RCP
一个SWT日期时间选择控件类,可方便地加入到自己的代码中,支持拖放
android-swt-演示演示如何使用桌面 Java 和 SWT 显示 Android 自定义绘制视图的原型这个原型包括两个项目: DrawIt - 一个非常简单的 Android 应用程序,其中包含一个自定义绘制的视图 (TestView) AndroidPaint - 一...
NULL 博文链接:https://salever.iteye.com/blog/719930
SWT、JFACE控件实例,官方的东西,各种控件例子! 已经把包名等修复好了。直接导入IDE中可以运行。各种效果。