`
semicircle
  • 浏览: 12602 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义的SWT控件:缩略图

阅读更多
效果图:


为了在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
分享到:
评论
1 楼 lhlinux 2008-12-06  
编译出错org.eclipse.swt.layout.GridData cannot be cast to org.eclipse.swt.layout.FillData

相关推荐

    java swt自定义控件

    本文将深入探讨在Java中使用SWT进行自定义控件的开发。 ### 1. SWT概述 SWT是一个开源的Java库,它的目标是提供与原生GUI库(如Windows的Win32 API,Mac OS的Cocoa,Linux的GTK+)类似的性能和功能。SWT使用JNI...

    SWT 自定义控件

    ### SWT 自定义控件开发详解 #### 背景与需求 随着基于Eclipse平台的应用程序日益增多,开发者越来越依赖于SWT/JFace等提供的工具包来构建丰富的用户界面。然而,这些内置组件库虽然提供了大量的基础控件,但在特定...

    SWT/JFace 自定义日历控件(可绑定注册到其他控件)

    SWT自带的DateTime控件属实不好用,而且无法绑定到其他控件上。因此自己写一个日历控件用着方便,功能大致如下: 1、日历控件可自定义设置常见的几种日期格式; 2、可以绑定注册到其他控件如:文本框、按钮、标签上...

    Draw2D 模拟SWT控件之RadioButton、CheckedBox

    总结来说,Draw2D模拟SWT的RadioButton和CheckedBox控件是通过自定义图形对象和事件处理来实现的,这在一些需要高度定制界面或者跨平台应用的场景下非常有用。通过结合源码和工具,我们可以创造出更符合用户需求的...

    Draw2D 模拟SWT控件之TextField、TextArea

    "Draw2D模拟SWT控件之TextField、TextArea"这个主题聚焦于使用Draw2D库来模仿SWT(Standard Widget Toolkit)中的两种基本输入控件:TextField和TextArea。SWT是Eclipse基金会的一个开源项目,用于构建原生外观的...

    自定义SWT组件文档,源自Eclispe 官方

    然而,为了满足特定需求或实现独特的功能,有时我们需要创建自定义的SWT组件。本篇文章将深入探讨如何自定义SWT组件,包括创建独立组件和复合组件,并分析如何在保证跨平台兼容性的前提下进行扩展。 创建自定义组件...

    SWT控件

    **SWT控件详解** SWT(Standard Widget Toolkit)是由Eclipse基金会开发并维护的一套用于构建图形用户界面(GUI)的开源库,它是Java语言中的一个GUI工具包,主要面向那些希望创建高性能、原生外观的应用程序的...

    开发Eclipse自定义控件

    在开发Eclipse自定义控件时,我们首先要理解Eclipse的SWT(Standard Widget Toolkit)和JFace这两者的作用。SWT是Eclipse提供的一套底层的GUI库,它提供了与操作系统紧密集成的原生控件,而JFace则是在SWT之上构建的...

    一个SWT日期时间选择控件类

    `src`目录可能包含了源代码,这为开发者提供了查看和自定义控件行为的机会。通过查看源代码,他们可以了解控件的工作原理,学习如何处理事件、定制样式或者扩展功能。对于那些想要深入理解SWT控件实现的人来说,这是...

    SWT日期时间选择控件.rar

    在这个“SWT日期时间选择控件.rar”压缩包中,包含的是一个针对SWT框架自定义封装的日期和时间选择器控件。这个控件允许用户方便地选取特定的日期和时间,提高了用户界面的交互性和用户体验。 在SWT中,虽然有基础...

    SWT 时间控件及执行bat文件

    在“SWT 时间控件及执行bat文件”这个例子中,我们将探讨如何使用SWT来创建时间选择控件,以及如何利用Java的TimerTask类进行定时任务,同时还会学习如何通过批处理(bat)文件运行Java应用程序。 1. SWT时间控件:...

    SWT控件2

    标题“SWT控件2”指的是在软件开发中使用SWT(Standard Widget Toolkit)库创建用户界面时涉及的第二部分控件。SWT是Eclipse项目的一个组成部分,它提供了一套与操作系统直接交互的GUI(图形用户界面)控件,以实现...

    自制SWT软件:悄悄背单词~

    个人兴趣做的swt小软件,可用来背单词,但苦于没有词库只弄了个6级高频……如果熟悉xml,也可以自建词库,但名称必须不能是中文的。 互相学习互相分享,欢迎赐教。 另有该软件的日语版,不知道有没人下载,暂不上传...

    SWT控件知识学习笔记

    ### SWT控件知识学习笔记 #### 一、SWT/JFace常用组件介绍 SWT (Standard Widget Toolkit) 是 Eclipse 平台的一个图形界面工具包,它提供了与平台无关的 GUI 组件,允许开发者构建高性能的应用程序。SWT/JFace ...

    Java使用SWT JFreeChart控件实现的小游戏.zip

    Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...

    SWT.rar_swt自定义组件

    本资源“SWT.rar_swt自定义组件”是一个关于如何在Eclipse中利用SWT来创建自定义控件的学习资料,特别适合初学者探索和实践。 1. SWT基础:SWT是Eclipse基金会维护的一个项目,它提供了一系列的类和接口,用于构建...

    org.eclipse.swt相关所有jar包,

    "BrowserFunction"可能指的是SWT浏览器控件的高级特性或自定义扩展。这些可能包括了自定义的URL处理器、JavaScript扩展、或者是对浏览器事件的特殊处理。通过这些功能,开发者可以进一步定制浏览器的行为,使其更好...

Global site tag (gtag.js) - Google Analytics