站在巨人的肩膀上才能看得更远。因此在SWT应用开发中,我们希望继承现有的基于Swing的丰富代码。转移过程需要的关注点不少,其中图片对象的转换必不可少。Swing的Image对象与SWT的Image对象不尽相同,但转换的办法还是有的。我参考过网上的一些实现代码,但是图标的透明处理效果总留遗憾。转换后,原本透明的部分变成了黑色,很是扎眼。我对相关代码进行了修改,解决了这一困扰。一点经验,与大家分享。
透明的实现关键是SWT ImageData对象的transparentPixel属性设置。它将特定的色素指定为透明。下面是完整的程序代码:
package com.example.draw;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.DirectColorModel;
import java.awt.image.ImageObserver;
import java.awt.image.WritableRaster;
import javax.swing.ImageIcon;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
*
* Change javax.swing.ImageIcon object to org.eclipse.swt.graphics.Image object.
*
* @author Freshwind
*/
public class ImageConvertor {
public ImageConvertor() {
super();
}
/**
* change ImageIcon to BufferedImage
*
* @param icon
* @return
*/
public static BufferedImage getBufferedImage(ImageIcon icon) {
int width = icon.getIconWidth();
int height = icon.getIconHeight();
ImageObserver observer = icon.getImageObserver();
BufferedImage bufferedImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics gc = bufferedImage.createGraphics();
gc.drawImage(icon.getImage(), 0, 0, observer);
return bufferedImage;
}
/**
* change BufferedImage to ImageData
*
* @param bufferedImage
* @return
*/
public static ImageData getImageData(BufferedImage bufferedImage) {
DirectColorModel colorModel = (DirectColorModel) bufferedImage
.getColorModel();
PaletteData palette = new PaletteData(colorModel.getRedMask(),
colorModel.getGreenMask(), colorModel.getBlueMask());
ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage
.getHeight(), colorModel.getPixelSize(), palette);
int whitePixel = data.palette.getPixel(new RGB(255, 255, 255)); //将白色设定为透明色
WritableRaster raster = bufferedImage.getRaster();
int[] pixelArray = new int[3];
for (int y = 0; y < data.height; y++) {
for (int x = 0; x < data.width; x++) {
raster.getPixel(x, y, pixelArray);
int pixel = palette.getPixel(new RGB(pixelArray[0],
pixelArray[1], pixelArray[2]));
if (pixel == 0) //Swing读取PNG图形文件,透明的色素被置为0,所以格式转换是,将它变为白色(之前定义的透明色素)。
data.setPixel(x, y, whitePixel);
else
data.setPixel(x, y, pixel);
}
}
data.transparentPixel = whitePixel; //将白色指定为透明色素(同理将其它颜色定为透明色素也是可行的)。
return data;
}
public static void main(String[] args) {
ImageIcon icon = new ImageIcon(
"E:\\mypic\\picture.png");
BufferedImage bufferedImage = getBufferedImage(icon);
ImageData data = getImageData(bufferedImage);
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Image Convertor");
shell.setLayout(new FillLayout());
shell.setBackground(new Color(display, new RGB(255, 255, 255)));
shell.setSize(350, 100);
Label label = new Label(shell, SWT.NONE);
// new Image with ImageData which is generated previously.
Image image = new Image(display, data);
label.setImage(image);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
分享到:
相关推荐
总之,“在SWING、SWT中嵌入浏览器”涉及到对Java GUI库的深入理解,以及如何利用这些库与Web技术进行集成。无论是SWING还是SWT,都有其独特的方法和挑战,开发者需要根据项目需求和目标平台选择合适的方法。
在标题提到的"swt源码和jar包dj-native-swing-swt.jar"中,"dj-native-swing-swt.jar"是一个特殊的库,它结合了SWT和JNativeSwing,允许在Java Swing应用中嵌入SWT组件。这使得开发者可以在同一应用程序中同时使用...
### 开发项目用SWING与RCP与SWT.JFACE的分析 #### 一、SWT简介 SWT(Standard Widget Toolkit)作为一种图形用户界面工具包,为Java开发者提供了创建高性能且外观统一的桌面应用程序的能力。相较于传统的AWT和...
swing2swt java应用开发包,貌似现在很少了
SWT Designer还支持布局管理器,例如GridLayout、 MigLayout 和 GroupLayout,这些布局管理器可以帮助组织和对齐组件,确保界面在不同屏幕尺寸下都能保持良好的显示效果。此外,SWT Designer还提供了事件处理的可视...
Java Swing和 SWT 是两种在Java中创建图形用户界面(GUI)的库,它们都提供了丰富的组件和工具来构建桌面应用程序。在这篇文章中,我们将深入探讨Java Swing中的分页技术和SWT(Standard Widget Toolkit)的使用,...
swt swing awt的区别
网上很多关于Java创建透明图片的例子,但我试过之后都不好使。这个短短几行代码,就可以实现,只是一个方法,直接调用就可以。
在Java编程领域,Swing和SWT(Standard Widget Toolkit)是两种主要的GUI(图形用户界面)工具包,用于创建桌面应用程序。这个“关于swing和swt的小练习”压缩包文件提供了一些实际的代码示例,帮助开发者深入理解这...
### Java Swing 迁移到 SWT 的相关知识点 #### 1. 关于本教程 - **教程简介**:本教程旨在帮助开发者了解如何将基于 Java Swing 的应用程序迁移到 SWT(Standard Widget Toolkit)。自2001年首次发布并捐赠给开源...
在Java编程领域,Swing、AWT和SWT都是用于构建图形用户界面(GUI)的框架。本篇文章将详细介绍如何在Eclipse集成开发环境中(IDE)搭建这些框架的开发环境,以及可以使用的相关插件。 首先,让我们从AWT(Abstract ...
Java是一种广泛使用的编程语言,在图形用户界面(GUI)设计领域提供了多种开发包,其中比较著名的有Swing、SWT和AWT。这三种技术各有特点和适用场景,在开发Java图形界面应用时,开发者需要根据实际需求选择最合适的...
当我们需要在Swing应用中展示图片时,可以利用特定的方法来读取并显示图像。本篇文章将详细讲解如何在Java Swing中读取和显示图片,以及与之相关的知识点。 首先,我们需要了解Java中的图像处理类。`java.awt.Image...
Swing组件可以拥有透明背景,支持非矩形形状,而且更容易进行自定义和扩展。 **轻量构件**是Swing的一个关键特性,它们直接继承自Component或Container类,没有同位体,而是嵌套在重量级容器(如JFrame或JApplet)...
迁移Swing代码到SWT的过程中,有一些基本步骤可以帮助减少工作量并确保转换过程尽可能平滑: 1. **评估Swing应用程序的现状**:了解当前Swing应用的结构和功能需求,确定哪些部分可以直接迁移,哪些部分需要重构。 ...
在Java桌面应用开发领域,Swing和SWT(Standard Widget Toolkit)是两个常用的库,用于创建用户界面。本篇文章将深入探讨Eclipse中的Swing和SWT插件,特别是jigloo插件。 Swing是Java Foundation Classes (JFC)的一...
Eclipse Swing SWT Builder插件就是专门针对这两个库设计的,它极大地简化了Swing和SWT组件的设计和布局工作。 Swing是Java的标准GUI库,基于Java AWT(抽象窗口工具包)并扩展了它,提供了更多的组件和更现代的...
例如,可以使用ArrayList来存储图片对象,HashMap来关联图片与元数据。 7. **异常处理**:在进行文件操作和网络通信时,可能会遇到异常情况。通过try-catch语句块捕获和处理异常,可以确保程序的稳定性和用户体验。...
这种布局非常适合用来实现“卡片切换”的效果,就像在这个程序中,每次点击`JComboBox`的选项时,都会像翻卡片一样显示新的图片。使用`CardLayout`需要添加组件到一个容器(如JPanel),并为每个组件分配一个唯一的...
标题中的"DJNativeSwing-SWT有关的所有jar,java将HTML页面转为图片"涉及到的是一个Java库,DJNativeSwing-SWT,它允许...正确理解和使用这个库,可以帮助开发者在各种场景下实现高效、高质量的HTML到图片的转换。