`
mylxiaoyi
  • 浏览: 327603 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[翻译]核心Swing组件(四)

    博客分类:
  • Java
阅读更多

4.4 Icon接口

Icon接口用来将图标与各种组件相关联。一个图标可以是简单的绘画或者是使用ImageIcon类由磁盘所载入的GIF图像。这个接口包含描述尺寸的两个属性以及一个用来绘制图标的方法。

public interface Icon {
  // Properties 
  public int getIconHeight();
  public int getIconWidth();
  // Other methods
  public void paintIcon(Component c, Graphics g, int x, int y);
}

4.4.1 创建图标

图标的创建非常简单,只需要简单的实现接口。我们所需要做的就是指定图标的尺寸以及要绘制的内容。列表4-3演示了一个Icon的实现。这个图标是一个菱形图标,其尺寸,颜色以及填充状态都是可以配置的。

package swingstudy.ch04;
 
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Polygon;
 
import javax.swing.Icon;
 
public class DiamondIcon implements Icon {
 
	private Color color;
	private boolean selected;
	private int width;
	private int height;
	private Polygon polygon;
	private static final int DEFAULT_WIDTH = 10;
	private static final int DEFAULT_HEIGHT = 10;
 
	public DiamondIcon(Color color) {
		this(color, true, DEFAULT_WIDTH, DEFAULT_HEIGHT);
	}
 
	public DiamondIcon(Color color, boolean selected) {
		this(color, selected, DEFAULT_WIDTH, DEFAULT_HEIGHT);
	}
 
	public DiamondIcon(Color color, boolean selected, int width, int height) {
		this.color = color;
		this.selected = selected;
		this.width = width;
		this.height = height;
		initPolygon();
	}
 
	private void initPolygon() {
		polygon = new Polygon();
		int halfWidth = width/2;
		int halfHeight = height/2;
		polygon.addPoint(0, halfHeight);
		polygon.addPoint(halfWidth, 0);
		polygon.addPoint(width, halfHeight);
		polygon.addPoint(halfWidth, height);
	}
	@Override
	public int getIconHeight() {
		// TODO Auto-generated method stub
		return height;
	}
 
	@Override
	public int getIconWidth() {
		// TODO Auto-generated method stub
		return width;
	}
 
	@Override
	public void paintIcon(Component c, Graphics g, int x, int y) {
		// TODO Auto-generated method stub
		g.setColor(color);
		g.translate(x, y);
		if(selected) {
			g.fillPolygon(polygon);
		}
		else {
			g.drawPolygon(polygon);
		}
		g.translate(-x, -y);
	}
 
}

4.4.2 使用图标

一旦我们有了Icon的实现,使用Icon就如何查看一个组件具有相应的属性一样简单。例如,下面的代码创建了一个具有图标的标签:

Icon icon = new DiamondIcon(Color.RED, true, 25, 25); 
JLabel label = new JLabel(icon); 

图4-10显这个标签的运行结果。

Swing_4_10

4.4.3 ImageIcon类

ImageIcon类提供了由AWT Image对象创建图标的Icon接口实现,Image对象可以来自内存(byte[]),来自磁盘(文件名)或是来自网络(URL)。与普通的Image对象不同,ImageIcon的载入是当ImageIcon被创建时立即启动的,尽管当使用时他也许还没有完全载入。另外,与Image对象不同,ImageIcon对象是可序列化的,所以他们可以很容易为JavaBean组件所使用。

创建ImageIcon

有九个构造函数可以用于创建ImageIcon:

public ImageIcon()
Icon icon = new ImageIcon();
icon.setImage(anImage);
 
public ImageIcon(Image image)
Icon icon = new ImageIcon(anImage);
 
public ImageIcon(String filename)
Icon icon = new ImageIcon(filename);
 
public ImageIcon(URL location)
Icon icon = new ImageIcon(url);
 
public ImageIcon(byte imageData[])
Icon icon = new ImageIcon(aByteArray);
 
public ImageIcon(Image image, String description)
Icon icon = new ImageIcon(anImage, "Duke");
 
public ImageIcon(String filename, String description)
Icon icon = new ImageIcon(filename, filename);public ImageIcon(URL location, String description)
Icon icon = new ImageIcon(url, location.getFile());
 
public ImageIcon(URL location, String description)
Icon icon = new ImageIcon(url, location.getFile());
 
public ImageIcon(byte imageData[], String description)
Icon icon = new ImageIcon(aByteArray, "Duke");

无参数的构造函数创建一个未初始化的版本。其余的八个构造函数提供了由Image,byte数组,文件名String或是URL,带有或是不带有描述来创建ImageIcon的功能。

使用ImageIcon

使用ImageIcon就如同使用Icon一样简单:仅需要创建ImageIcon并将其组件相关联。

Icon icon = new ImageIcon("Warn.gif");
JLabel label3 = new JLabel("Warning", icon, JLabel.CENTER)

ImageIcon属性

表4-10显示了ImageIcon的六个属性。ImageIcon的高与宽是实际的Image对象的高与宽。imageLoadStatus属性表示由隐藏MediaTracker载入ImageIcon的结果,或者是MediaTracker.ABORTED,MediaTracker.ERRORED,MediaTracker.COMPLETE。

ImageIcon属性

属性名
数据类型

访问性

description
String

读写

iconHeight
int

只读

iconWidth
int

只读

image
Image

读写

imageLoadStatus
int

只读

imageObserver
ImageObserver

读写

有时使用ImageIcon来载入一个Image,然后由Image对象获取Icon是十分有用的。

ImageIcon imageIcon = new ImageIcon(...);
Image image = imageIcon.getImage();

使用ImageIcon对象时有一个主要问题:使用图标的图像与类文件都是由JAR文件载入时,他们不能工作,除非我们为JAR中的文件指定了完全的URL。我们不能仅仅指定文件名为一个String并使得ImageIcon查找这个文件。我们必须首先手动获取图像数据,然后将这些数据传递给ImageIcon构造函数。

为了解决在JAR文件外部载入图像,列表4-4显示了一个ImageLoader类,这个类提供了一个public static Image getImage(Class relativeClass, String filename)方法。我们同时指定图像文件相对的基类以及图像文件的名字。然后我们只需要将返回的Image对象传递给ImageIcon的构造函数。

package swingstudy.ch04;
 
import java.awt.Image;
import java.awt.Toolkit;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
 
public class ImageLoader {
 
	private ImageLoader() {
 
	}
 
	public static Image getImage(Class relativeClass, String filename) {
		Image returnValue = null;
		InputStream is = relativeClass.getResourceAsStream(filename);
		if(is != null) {
			BufferedInputStream bis = new BufferedInputStream(is);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			try {
				int ch;
				while ((ch = bis.read()) != -1) {
					baos.write(ch);
				}
				returnValue = Toolkit.getDefaultToolkit().createImage(baos.toByteArray());
			}
			catch(IOException e) {
				System.err.println("Error loading: "+filename);
			}
		}
		return returnValue;
	}
}

下面的代码显示如何使用这个帮助类:

Image warnImage = ImageLoader.getImage(LabelJarSample.class, "Warn.gif");
Icon warnIcon = new ImageIcon(warnImage);
JLabel label2 = new JLabel(warnIcon);

4.4.4 GrayFilter类

另一个值得一提的类就是GrayFilter类。许多Swing组件依赖这个类来创建一个禁止的Image版本用作Icon。组件自动使用这个类,但是有时我们需要使用AWT的ImageFilter类实现灰度平衡。我们可以通过调用类的一个方法将一个Image由普通形式转换为灰度形式:public static Image crateDisabledImage(Image image)。

Image normalImage = ...
Image grayImage = GrayFilter.createDisabledImage(normalImage)

现在我们可以使用一个灰色的图像作为组件的Icon:

Icon warningIcon = new ImageIcon(grayImage);
JLabel warningLabel = new JLabel(warningIcon);
分享到:
评论

相关推荐

    最全面的swing文本编辑器

    Swing 是 Java GUI 开发的重要库,它提供了一组组件和工具来创建桌面应用程序。"最全面的Swing文本编辑器"是一个利用Java Swing构建的高级文本编辑器,旨在提供比标准记事本更丰富的功能,如插入图片、鼠标绘图等。...

    introduction to gui programming with java swing

    ### Swing组件与容器 Swing提供了多种预定义的组件,如按钮(JButton)、文本框(JTextField)、复选框(JCheckBox)、单选按钮(JRadioButton)、滑动条(JSlider)、菜单(JMenu)等,以及容器如面板(JPanel)、...

    基于JavaSwing办公自动化系统(源代码+SQL+论文+外文翻译)

    1. **JavaSwing组件**:JavaSwing提供了一系列组件,如JButton(按钮)、JLabel(标签)、JTextField(文本框)、JTextArea(文本区域)、JTable(表格)等,用于构建用户交互界面。这些组件允许用户进行数据输入、...

    javaswing电子英汉词典(idea和eclipse都能打开).zip

    Swing是完全由Java编写的,它提供了一个轻量级的组件模型,与Java AWT(Abstract Window Toolkit)相比,Swing组件具有更好的外观和更多的定制选项。Swing组件通常比AWT组件更现代,且在不同的操作系统上有一致的...

    java 简易翻译系统

    在这个翻译系统中,Swing被用来设计和实现用户界面,包括文本输入框、按钮、标签等组件,用户可以通过这些组件与程序进行交互。 3. **用户界面设计**:良好的用户界面设计对于任何应用都是至关重要的。在这个系统中...

    swing界面的屏幕取词

    标题中的“Swing界面的屏幕取词”是指在Java Swing环境下实现的一种屏幕选取单词并进行翻译或查询的功能。Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和API,允许开发者创建桌面应用程序。屏幕...

    java swing一篇轻松学习(高考后可以自学)对照编码

    总的来说,学习Java Swing需要理解GUI组件、事件处理、布局管理和线程安全等核心概念。通过实际编写代码,结合本文档提供的例子,你将能够逐步掌握Swing,并能创建出美观且功能丰富的桌面应用程序。记得在实践中不断...

    Core Java.JAVA核心技术(中文版)

    8. **Java Swing与JavaFX图形界面**: - **组件与布局管理**:创建窗口、添加控件,理解各种布局管理器如FlowLayout、GridLayout、BorderLayout等。 - **事件处理**:监听用户交互,如按钮点击、键盘输入等事件。 ...

    一个Java语言翻译程序,输入英文翻译到汉语,通过加载自己编写的词汇库进行匹配,能进行一些日常语的翻译.zip

    这个程序的核心在于它能够加载用户自定义的词汇库,并利用这些词汇库进行日常用语的翻译。下面我们将深入探讨Java语言特性、翻译算法、词汇库管理和用户接口等方面的知识。 首先,Java是一种跨平台的面向对象的编程...

    java调用google的翻译实例

    此方法实现了核心的翻译逻辑: - 首先根据选择的语言方向确定源语言和目标语言。 - 使用`Translate.translate`方法进行翻译,并将结果展示在`toTextArea`文本框中。 - 如果发生异常,则通过日志记录器记录错误信息。...

    四则运算JAVA计算器

    该项目是一个基于Java Swing的简单计算器应用程序,能够实现基本的四则运算功能,并且支持括号操作,以解决优先级问题。为了处理复杂的数学表达式,该计算器还引入了栈的概念。 #### 二、项目结构与组件分析 1. **...

    Java2核心技术.part5

    第9章swing用户界面组件 9.1模型一视图一控制器设计模式 9.2布局管理器慨述 9.2.1边界布局 9.2.2面板 9.2.3网格布局 9.3文本输入 9.3.1文本域 9.3. 2标签与标签组件 9.3 3文本域变化跟踪 ...

    Java Swing Database Components-开源

    `HomeDatabase.jar`可能是一个示例应用或者一个包含核心数据库操作的库,它展示了如何在Swing应用中使用这些数据库组件。这可以帮助开发者快速上手,并理解如何在实际项目中整合这些组件。 `lgpl.txt`和`MultiShow_...

    第四次Java机房作业

    这两个组件都是Java Swing库中用于创建选项选择的控件。Checkbox,中文可称为复选框,允许用户选择一个或多个选项,每个选项都可以独立被选中或取消选中。而Choice,通常翻译为下拉列表或选择框,它显示一组可选项,...

    《Java游戏开发》的中文翻译

    虽然代码示例基于较旧的JDK1.4.2,但其核心原理和编程思想对于现代Java游戏开发仍然具有指导价值。 首先,Java作为游戏开发语言的优势在于其跨平台性、强大的类库支持以及成熟的开发环境。Java的垃圾回收机制和自动...

Global site tag (gtag.js) - Google Analytics