成绩:
JAVA 编程 B 实验报告
实验七: 基于 JAVA 的 图像处理软件
实验时间:2012年 6月10 日星期日
JAVA 编程 B 实验报告
一、实验名称
Java 编程 B 综合性实验
二、实验目的
1、掌握J2SE应用程序的设计 。
2、掌握抽象窗口工具包AWT的使用。
3、掌握应用程序用户界面的开发工具包 SWING 的使用
三、实验平台
操作系统: Windows 7
JDK:JDK 1.7
IDE:Eclipse 3.5
四、 结构框图
打开程序
打开文件
缩放
旋转
图 像 灰 度
变形
扭曲
缩小
放大
90 度 180
270
灰度 直方
拉
展宽
扭曲
五、实验内容
1、抽象窗口工具包(Abstract Window Toolkit,AWT)简介
1
功能:包含用于创建用户界面和绘制图形图像的所有类。
描述:包含用于创建用户界面和绘制图形图像的所有类。在AWT术语中,诸
如按钮或滚动条之类的用户界面对象称为组件。Component 类是所有AWT组件的
根。有关所有AWT组件的公共属性的详细描述,请参见 Component。
当用户与组件交互时,一些组件会激发事件。AWTEvent 类及其子类用于表
示AWT组件能够激发的事件。有关AWT事件模型的描述,请参见 AWTEvent。
容器是一个可以包含组件和其他容器的组件。容器还可以具有布局管理器,用来
控制容器中组件的可视化布局。AWT 包带有几个布局管理器类和一个接口,此接
口可用于构建自己的布局管理器
2、用户界面的开发工具包Swing简介
Swing是一个用于开发Java应用程序用户界面的开发工具包,以抽象窗口工
具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing
开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创
建优雅的用户界面。
创建图形界面步骤:(1)导入Swing包;(2)选择界面风格;(3)设置顶层
容器;(4)设置按钮和标签;(5)将组件放到容器上;(6)为组件增加边框;(7)
处理事件;(8)辅助技术支持。
导入Swing包
下面语句导入Swing包
import javax.swing.*;
大部分Swing程序用到了AWT的基础底层结构和事件模型,因此需要导入两个
包:
import java.awt.*;
import java.awt.event.*;
如果图形界面中包括了事件处理,那么还需要导入事件处理包:
import javax.swing.event.*;
选择界面风格
Swing允许选择程序的图形界面风格常用的有java风格,windows风格等。
下面的代码用于选择图形界面风格,这里选择的是跨平台的Java界面风格。
try { UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName( )); }
catch (Exception e) { }
设置顶层容器
图形界面至少要有一个顶级Swing容器,顶级Swing容器为其它Swing组件在
屏幕上的绘制和处理事件提供支持。常用的顶级容器:
JFrame(框架):表示主程序窗口
JDialog(对话框):每个JDialog对象表示一个对话框,对话框属于二级窗
口
JApplet(小程序):在浏览器内显示一个小程序界面
一个框架包括边界、菜单栏、工具栏、状态栏,以及中间占主要部分的窗格。
窗格也可以看作是一种面板,但它是框架的一个组成部分;组件不会直接放到框
架上,而是放在若干个面板上,这些面板再放到窗格上。
用框架对象的getContentPane()函数来获得窗格,再调用窗格的add()函数
放置面板。
2
public static void main(String[ ]args){JFrame frame=new
JFrame("SwingApplication");
JPanel panel1=new JPanel();
frame.getContentPane().add(panel1,BorderLayout.CENTER);
......//
添加其他组件
frame.pack();frame.setVisible(true);}
模式使用
关键是java.awt.*里面的两个与显示设备有关的类:GraphicsEnvironment
和GraphicsDevice。
GraphicsEnvironment为Java应用程序提供了特定平台的 GraphicsDevice
对象和 Font 对象集合。这些GraphicsDevice可以是各种本机和远端机器的资
源,如屏幕、打印机或者是Image Buffer,甚至是Graphics2D绘图方法的目标对
象。
而GraphicsDevice就是指特定的图形环境了,如屏幕和打印设备等。这样,
我们就可以用GraphicsDevice来操纵屏幕了。GraphicsDevice提供的
setFullScreenWindow()方法就是设置全屏幕用的。
事件处理
监听器:ActionListener
方 法:actionPerformed
事 件:ActionEvent
● String getActionCommand()
actioncommand是控件内部的一个字符串,用于标识控件的状态。
此函数可以取得控件的状态,从而决定到底该做什么。
● int getModifiers()
取得“产生此事件时,用户同时按下的组合键”
● long getWhen()
取得“产生此事件时的时间戳”
事件产生原因:点击按钮,在列表框中选择内容,在文本框中点回车,计时
器到期
监听器:AdjustmentListener
方 法:adjustmentValueChanged
事 件:AdjustmentEvent
● Adjustable getAdjustable()
adjustable是一个接口,各种滚动条都实现了这个接口。
● int getAdjustmentType()
取得滚动类型,共有UNIT_INCREMENT,UNIT_DECREMENT,BLOCK_INCREMENT,
BLOCK_DECREMENT,TRACK共5种类型
● int getValue()
取得滚动滑块的当前值
事件产生原因:滚动条的滚动
监听器:ItemListener
方 法:itemStateChanged
事 件:ItemEvent
3
● Objedt getItem()
取得被选中的元素。注意,返回值是Object,还应该进行强制类型转换。
● ItemSelectable getItemSelectable()
ItemSelectable是一个接口,代表那些包含了n个可供选择的子元素的对象。
此方法返回产生此事件的对象。此方法的作用主要在于,如果一个列表框是允许
多选的,那么上面的方法就不好用了,应该用此方法得到列表对象,再取得被选
中的多个元素。
● int getStateChange()
取得选择的状态,是SELECTED还是DESELECTED
事件产生原因:各种按钮的点击,列表框的选择
监听器:FocusListener
方 法:focusGained、focusLost
事 件:FocusEvent
● Component getOppositeComponent()
得到“参与焦点变换的”另一个对象。如果是焦点取得事件,则返回之前拥
有焦点的对象;如果是焦点失去事件,则返回得到焦点的对象。若焦点转移到另
外一个应用程序,返回null
● boolean isTemporary()
焦点是临时性转移还是永久转移。临时性转移:用鼠标拖动窗口或者窗口变
为非激活状态。其他为永久性转移。
事件产生原因:各种组件的焦点变化
监听器:KeyListener
方 法:keyPressed、keyReleased、keyTyped
事 件:KeyEvent
● char getKeyChar()
此方法只在keytyped中有效,返回按下的字符。比如按下shift+a,返回'A'
● int getKeyCode()
取得键盘上按键的整数编码。请注意,是键盘上的按键,比如F1,Ctrl,Home
键等等,都有相应编码。不支持组合键,也就是说“Shift+a”和“a”返回同样
的内容,都是小写a的ASCII码。但是大键盘的数字键和小键盘的数字键返回内容
不同。
● static String getKeyModifiersText(int modifiers)
将掩码转化为字符串,比如“Ctrl”,“Ctrl+Shift”等。注意它是static
方法
法
● static String getKeyText(int keyCode)
返回keyCode代表的按钮的名字,比如"Home","F1"等。注意它是statci方
事件产生原因:在各种组件上敲击键盘
监听器:MouseListener
方 法:mouseClicked、mousePressed、mouseReleased
mouseEntered、mouseExited
事 件:MouseEvent
● Point getLocationOnScreen()
返回鼠标相对于显示屏幕的绝对坐标(Java1.6版提供)
4
● int getXOnScreen()
返回鼠标相对于显示屏幕的X的绝对坐标(java 1.6版提供)
● int getYOnScreen()
返回鼠标相对于显示屏幕的Y的绝对坐标(java 1.6版提供)
● Point getPoint()
返回鼠标相对于组件的绝对坐标
● int getX()
返回鼠标相对于组件的X的绝对坐标
● int getY()
返回鼠标相对于组件的Y的绝对坐标
● void translatePoint(int x, int y)
给鼠标的做用点加上一个偏移量。比如2个参数分别是10, 20,你要用鼠标
画直线,当你鼠标指向100,100开始画,实际上的线是画在110,120处
● int getClickCount()
产生此事件时鼠标共点击了多少下(单击、双击、三击……)
● int getButton()
产生此事件时,鼠标的哪个键被点击了:NOBUTTON, BUTTON1, BUTTON2 或
者 BUTTON3
● boolean isPopupTrigger()
是否能够触发一个弹出式菜单。由于各平台触发弹出式菜单的情况不一样,
因此应该在mousePressed 和 mouseReleased中都检测一下
事件产生原因:在任何组件上点击鼠标、将光标移动进来或出去
监听器:MouseMotionListener
方 法:mouseDragged、mouseMoved
事 件:MouseEvent
事件产生原因:在任何组件上移动鼠标
监听器:MouseWheelListener
方 法:mouseWheelMoved
事 件:MouseWheelEvent
● int getScrollType()
滚动的类型,是按块滚动WHEEL_BLOCK_SCROLL还是按单位滚动
WHEEL_UNIT_SCROLL
● int getScrollAmount()
返回为相应此事件应该滚动的单位数。此方法有效的前提是按单位滚动。
● int getWheelRotation()
鼠标滚轮滚动过程中”咔嚓“声的数目。向上滚为负值,向下滚为正值
事件产生原因:在任何组件上滚动鼠标中键
监听器:WindowListener
方 法:windowOpened、windowClosing、windowClosed、windowIconified
windowDeiconified、windowActivated、windowDeactivated
事 件:WindowEvent
● Window getWindow()
返回发生此事件的window对象
● Window getOppositeWindow()
5
若发生了焦点转移,返回另一个参与此事件的window对象,或者null
● int getOldState()
窗口变化前的状态:NORMAL、ICONIFIED、MAXIMIZED_BOTH
● int getNewState()
窗口变化后的状态
事件产生原因:窗口发生变化
监听器:WindowFocusListener
方 法:windowGainedFocus、windowLostFocus
事 件:WindowEvent
事件产生原因:窗口得到或失去焦点
监听器:WindowstateListener
方 法:WindowstateChanged
事 件:WindowEvent
事件产生原因:窗口状态改变
四、代码分析
package
imust.imageprocessing;
package
imust.imageprocessing;
package imust.imageprocessing;
package
imust.imageprocessing;
import
java.awt.*;
import
java.awt.*;
import java.awt.*;
import
java.awt.*;
import
java.awt.event.*;
import
java.awt.event.*;
import java.awt.event.*;
import
java.awt.event.*;
java.awt.image.*;
import
import
java.awt.image.*;
import
import java.awt.image.*;
java.awt.image.*;
import
java.io.File;
import
java.io.File;
import
import java.io.File;
java.io.File;
import
java.io.FileFilter;
import
java.io.FileFilter;
import
import java.io.FileFilter;
java.io.FileFilter;
java.io.IOException;
import
import
java.io.IOException;
import
import java.io.IOException;
java.io.IOException;
javax.imageio.ImageIO;
import
import
javax.imageio.ImageIO;
import
import javax.imageio.ImageIO;
javax.imageio.ImageIO;
import
javax.swing.*;
import
javax.swing.*;
import
import javax.swing.*;
javax.swing.*;
public
public
public
public
class
class
class
class
ImageProcessing
ImageProcessing
ImageProcessing
ImageProcessing
extends
extends
extends
extends
JFrame
JFrame {{{{
JFrame
JFrame
borderLayout1=new
BorderLayout();
borderLayout1=new
BorderLayout();
borderLayout1=new
borderLayout1=new BorderLayout();
BorderLayout();
jmb=new
JMenuBar();
jmb=new
JMenuBar();
jmb=new
jmb=new JMenuBar();
JMenuBar();
file,edit,view,suofang,gray,see,save,move,niuqu;
file,edit,view,suofang,gray,see,save,move,niuqu;
file,edit,view,suofang,gray,see,save,move,niuqu;
file,edit,view,suofang,gray,see,save,move,niuqu;
ImageProcessing(String
title){
ImageProcessing(String
title){
ImageProcessing(String title){
ImageProcessing(String
title){
filepath="";
String
filepath="";
String
filepath="";
filepath="";
String
String
filename="";
String
filename="";
String
filename="";
filename="";
String
String
file2;
FileFileFile
file2;
File
file2;
file2;
BufferedImage
buffimg=null;
BufferedImage
buffimg=null;
BufferedImage buffimg=null;
BufferedImage
buffimg=null;
ic;ic;ic;ic;
ImageIcon
ImageIcon
ImageIcon
ImageIcon
Image
ia,l;
Image
ia,l;
ia,l;
Image
Image
ia,l;
JLabel
jLabel1=null;
JLabel
jLabel1=null;
JLabel
JLabel
jLabel1=null;
jLabel1=null;
BorderLayout
BorderLayout
BorderLayout
BorderLayout
JMenuBar
JMenuBar
JMenuBar
JMenuBar
JMenu
JMenu
JMenu
JMenu
public
public
public
public
super(title);
super(title);
super(title);
super(title);
6
JMenuItem("
dakai=new
JMenuItem("打开");");");");
dakai=new
JMenuItem("
dakai=new JMenuItem("
dakai=new
JMenu("
file=new
JMenu("文件");");");");
file=new
JMenu("
file=new JMenu("
file=new
JMenuItem
JMenuItem
JMenuItem
JMenuItem
dakai.addActionListener(new
dakai.addActionListener(new
dakai.addActionListener(new
dakai.addActionListener(new
file.add(dakai);
file.add(dakai);
file.add(dakai);
file.add(dakai);
file.addSeparator();
file.addSeparator();
file.addSeparator();
file.addSeparator();
dakai_actionAdapter(this));
dakai_actionAdapter(this));
dakai_actionAdapter(this));
dakai_actionAdapter(this));
JMenuItem("
tuichu=new
JMenuItem("退出");");");");
tuichu=new
JMenuItem("
tuichu=new JMenuItem("
tuichu=new
JMenuItem
JMenuItem
JMenuItem
JMenuItem
tuichu.addActionListener(new
tuichu.addActionListener(new
tuichu.addActionListener(new
tuichu.addActionListener(new
file.add(tuichu);
file.add(tuichu);
file.add(tuichu);
file.add(tuichu);
tuichu_actionAdapter(this));
tuichu_actionAdapter(this));
tuichu_actionAdapter(this));
tuichu_actionAdapter(this));
jmb.add(file);
jmb.add(file);
jmb.add(file);
jmb.add(file);
JMenu("
suofang=new
JMenu("缩放");");");");
suofang=new
JMenu("
suofang=new
suofang=new JMenu("
JMenuItem("
JMenuItem
suoxiao=new
JMenuItem("缩小");");");");
JMenuItem
suoxiao=new
JMenuItem("
JMenuItem
suoxiao=new JMenuItem("
JMenuItem
suoxiao=new
suoxiao.addActionListener(new
suoxiao.addActionListener(new
suoxiao.addActionListener(new
suoxiao.addActionListener(new
testImage_suoxiao_actionAdapter(this));
testImage_suoxiao_actionAdapter(this));
testImage_suoxiao_actionAdapter(this));
testImage_suoxiao_actionAdapter(this));
this.getContentPane().setLayout(borderLayout1);
this.getContentPane().setLayout(borderLayout1);
this.getContentPane().setLayout(borderLayout1);
this.getContentPane().setLayout(borderLayout1);
suofang.add(suoxiao);
suofang.add(suoxiao);
suofang.add(suoxiao);
suofang.add(suoxiao);
suofang.addSeparator();
suofang.addSeparator();
suofang.addSeparator();
suofang.addSeparator();
JMenuItem
JMenuItem
JMenuItem
JMenuItem
fangda.addActionListener(new
fangda.addActionListener(new
fangda.addActionListener(new
fangda.addActionListener(new
JMenuItem("
fangda=new
JMenuItem("放大");");");");
fangda=new
JMenuItem("
fangda=new JMenuItem("
fangda=new
testImage_fangda_actionAdapter(this));
testImage_fangda_actionAdapter(this));
testImage_fangda_actionAdapter(this));
testImage_fangda_actionAdapter(this));
suofang.add(fangda);
suofang.add(fangda);
suofang.add(fangda);
suofang.add(fangda);
jmb.add(suofang);
jmb.add(suofang);
jmb.add(suofang);
jmb.add(suofang);
JMenu("
edit=new
JMenu("旋转");");");");
edit=new
JMenu("
edit=new JMenu("
edit=new
JMenuItem
JMenuItem
JMenuItem
JMenuItem
xuanzhuan90.addActionListener(new
xuanzhuan90.addActionListener(new
xuanzhuan90.addActionListener(new
xuanzhuan90.addActionListener(new
JMenuItem("
xuanzhuan90=new
JMenuItem("旋转 90909090 度");");");");
xuanzhuan90=new
JMenuItem("
xuanzhuan90=new JMenuItem("
xuanzhuan90=new
xuanzhuan90_actionAdapter(this));
xuanzhuan90_actionAdapter(this));
xuanzhuan90_actionAdapter(this));
xuanzhuan90_actionAdapter(this));
edit.add(xuanzhuan90);
edit.add(xuanzhuan90);
edit.add(xuanzhuan90);
edit.add(xuanzhuan90);
edit.addSeparator();
edit.addSeparator();
edit.addSeparator();
edit.addSeparator();
JMenuItem
JMenuItem
JMenuItem
JMenuItem
xuanzhuan180.addActionListener(new
xuanzhuan180.addActionListener(new
xuanzhuan180.addActionListener(new
xuanzhuan180.addActionListener(new
JMenuItem("
xuanzhuan180=new
JMenuItem("旋转 180180180180 度");");");");
xuanzhuan180=new
JMenuItem("
xuanzhuan180=new JMenuItem("
xuanzhuan180=new
xuanzhuan180_actionAdapter(this));
xuanzhuan180_actionAdapter(this));
xuanzhuan180_actionAdapter(this));
xuanzhuan180_actionAdapter(this));
edit.add(xuanzhuan180);
edit.add(xuanzhuan180);
edit.add(xuanzhuan180);
edit.add(xuanzhuan180);
edit.addSeparator();
edit.addSeparator();
edit.addSeparator();
edit.addSeparator();
JMenuItem
JMenuItem
JMenuItem
JMenuItem
xuanzhuan270.addActionListener(new
xuanzhuan270.addActionListener(new
xuanzhuan270.addActionListener(new
xuanzhuan270.addActionListener(new
JMenuItem("
xuanzhuan270=new
JMenuItem("旋转 270270270270 度");");");");
xuanzhuan270=new
JMenuItem("
xuanzhuan270=new JMenuItem("
xuanzhuan270=new
7