`
helpbs
  • 浏览: 1172433 次
文章分类
社区版块
存档分类
最新评论

核心Swing组件(四)

 
阅读更多

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);
分享到:
评论

相关推荐

    Java-GUI编程之Swing组件.doc

    Java-GUI编程之Swing组件是Java编程语言中用于构建图形用户界面的一个核心组件。Swing是Java Foundation Classes(JFC)的一个组成部分,提供了丰富的图形用户界面组件,帮助开发者快速构建复杂的图形用户界面。 ...

    Swing JTable组件设置单元格合并

    Swing JTable组件设置单元格合并,内置Test测试类,核心API GridBagTable tasktable = new GridBagTable(model); tasktable.mergeCells(startRow, endRow, 0, 0);

    Java2图形设计卷Ⅱ:Swing

    用大量图示分析了Swing组件的特点、结构及相互关系,使有经验的编程人员能高效利用Swing的强大功能。本书对掌握Swing技术提供了最全面的参考 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Java程序设计:第9章 GUI组件和用户界面设计 .ppt

    本章节主要介绍了 Java 语言中的图形用户界面(Graphical User Interfaces,GUI)设计,涉及到 AWT 和 Swing 组件的概述、事件处理模型、GUI 组件的使用等内容。 一、AWT 和 Swing 组件概述 AWT(Abstract Window ...

    netbeans开发java_GUI程序_详细教程_基础教程借鉴.pdf

    Swing 是 Java 平台的 GUI 组件库,提供了许多组件来帮助开发者创建桌面应用程序。在本教程中,我们将学习如何使用 Swing 创建一个简单的 GUI 应用程序。 本资源提供了一个详细的教程,指导用户如何使用 NetBeans ...

    图书管理系统 就、Java+swing

    这个图书管理系统,主要是对图书和员工进行管理、维护,基本实现了借阅到规划图书的流程,采用swing组件,由纯Java语言编写而成,核心就是对数据库的增、删、改查

    基于Swing技术下的酒店客房信息管理系统源码+数据库+WORD毕业论文文档.zip

    系统基于JAVA的Application模式,使用Swing组件作为系统用户界面和MYSQL小型数据库管理系统实现。主要提供用户查询功能、住宿管理等功能,提供管理员客房、用户、系统信息的管理功能。 该系统遵循软件工程中的开发...

    Swing线程的深入理解和SwingWorker基础知识介绍[参照].pdf

    Swing 线程是 Swing 中的一个核心概念,理解它的工作机制是非常重要的。使用 SwingWorker,可以解决常见的线程问题,并且可以提高应用程序的性能和响应性。遵循最佳实践,开发者可以创建高质量的桌面应用程序。

    Java坦克大战游戏,基于Spring Boot,JDK8,Swing组件开发,有一些Bug,还在持续更新完善中....zip

    学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的...

    jhexviewer:JHexViewer是基本的十六进制查看器Swing组件,可用于基于该组件创建更复杂的十六进制查看器

    这是什么JHexViewer是基本的十六进制查看器Swing组件,可用于基于它创建更复杂的十六进制查看器。 为了使它可定制且易于扩展,我们付出了很多努力,而不是强迫您使用固定的实现。 几乎所有内容都可以更改,例如内容...

    基于Java的连连看游戏GUL-swing设计软件源代码+设计文档说明资料.zip

    基于Java的连连看游戏GUL_swing设计软件源代码+设计文档说明资料...本系统主要是运用Swing组件和事件处理技术,进行界面的绘制,鼠标的操作,以及积分的显示和沙漏的计时的显示等功能。 关键词:游戏;连连看;二维游戏

    函数调用参数传递类型(java)的用法介绍..ppt

    四、Swing 基础 Swing 是 Java 语言中的一个图形用户界面工具包,提供了许多组件来构建图形用户界面,如 JButton、JLabel、JPanel 等。Swing 组件都继承自 JComponent 类,并提供了许多方法来设置组件的属性和行为...

    基于Swing技术下的酒店客房信息管理系统源码含文档.zip

    系统基于JAVA的Application模式,使用Swing组件作为系统用户界面和MYSQL小型数据库管理系统实现。主要提供用户查询功能、住宿管理等功能,提供管理员客房、用户、系统信息的管理功能。 该系统遵循软件工程中的开发...

    Java语言程序设计:第十章 Java图形用户界面.ppt

    Swing组件是Java GUI的轻量级组件,用于创建图形用户界面。Swing组件包括JButton、JLabel、JTextField、JTable等。这些组件可以被用于创建复杂的图形用户界面。 七、创建GUI应用程序 创建GUI应用程序需要使用Java...

    JavaSE核心编程

    掌握Java语言基础知识 理解面向对象的编程思想 运用Java编写命令行程序 运用JDBC编写数据库访问程序 运用Swing组件编写图形用户界面程序 运用Swing组件和JDBC实现C/S结构的应用程序

    java图书馆swing源码-swingexplorer:SwingExplorer工具的核心文件

    可视化浏览应用程序组件层次结构 监控 AWT/Swing 事件 调试 2D 图形 轻松找到源代码中负责创建特定 UI 的位置。 监控线程规则违规 下面显示了 Swing Explorer 如何检查基本的 Swing 应用程序。 有关 Swing Explorer ...

    Java核心技术 卷1

    全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理、Swing用户界面组件、部署应用程序和Applet、异常日志断言和调试、叙述方式深入浅出,并包含大量示例,从而帮助读者...

    Java核心技术 卷I + 卷II(第9版)(中文带目录)

    全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理、Swing用户界面组件、部署应用程序和Applet、异常日志断言和调试、叙述方式深入浅出,并包含大量示例,从而帮助读者...

    java 核心技术第九版卷一卷二 英文版

    全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理、Swing用户界面组件、部署应用程序和Applet、异常日志断言和调试、叙述方式深入浅出,并包含大量示例,从而帮助读者...

    JAVA核心技术第八版(上下卷)全部源码

    全书共14章,包括Java基本的程序结构、对象与类、继承、接口与内部类、图形程序设计、事件处理、Swing用户界面组件、部署应用程序和Applet、异常日志断言和调试、叙述方式深入浅出,并包含大量示例,从而帮助读者...

Global site tag (gtag.js) - Google Analytics