基于JAVA的 图像处理软件文档格式.docx
《基于JAVA的 图像处理软件文档格式.docx》由会员分享,可在线阅读,更多相关《基于JAVA的 图像处理软件文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
2、用户界面的开发工具包Swing简介
Swing是一个用于开发Java应用程序用户界面的开发工具包,以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。
Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
创建图形界面步骤:
(1)导入Swing包;
(2)选择界面风格;
(3)设置顶层容器;
(4)设置按钮和标签;
(5)将组件放到容器上;
(6)为组件增加边框;
(7)处理事件;
(8)辅助技术支持。
导入Swing包
下面语句导入Swing包
importjavax.swing.*;
大部分Swing程序用到了AWT的基础底层结构和事件模型,因此需要导入两个包:
importjava.awt.*;
importjava.awt.event.*;
如果图形界面中包括了事件处理,那么还需要导入事件处理包:
importjavax.swing.event.*;
选择界面风格
Swing允许选择程序的图形界面风格常用的有java风格,windows风格等。
下面的代码用于选择图形界面风格,这里选择的是跨平台的Java界面风格。
try{UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
}
catch(Exceptione){}
设置顶层容器
图形界面至少要有一个顶级Swing容器,顶级Swing容器为其它Swing组件在屏幕上的绘制和处理事件提供支持。
常用的顶级容器:
JFrame(框架):
表示主程序窗口
JDialog(对话框):
每个JDialog对象表示一个对话框,对话框属于二级窗口
JApplet(小程序):
在浏览器内显示一个小程序界面
一个框架包括边界、菜单栏、工具栏、状态栏,以及中间占主要部分的窗格。
窗格也可以看作是一种面板,但它是框架的一个组成部分;
组件不会直接放到框架上,而是放在若干个面板上,这些面板再放到窗格上。
用框架对象的getContentPane()函数来获得窗格,再调用窗格的add()函数放置面板。
publicstaticvoidmain(String[]args){JFrameframe=newJFrame("
SwingApplication"
);
JPanelpanel1=newJPanel();
frame.getContentPane().add(panel1,BorderLayout.CENTER);
......//
添加其他组件
frame.pack();
frame.setVisible(true);
}
模式使用
关键是java.awt.*里面的两个与显示设备有关的类:
GraphicsEnvironment和GraphicsDevice。
GraphicsEnvironment为Java应用程序提供了特定平台的GraphicsDevice对象和Font对象集合。
这些GraphicsDevice可以是各种本机和远端机器的资源,如屏幕、打印机或者是ImageBuffer,甚至是Graphics2D绘图方法的目标对象。
而GraphicsDevice就是指特定的图形环境了,如屏幕和打印设备等。
这样,我们就可以用GraphicsDevice来操纵屏幕了。
GraphicsDevice提供的setFullScreenWindow()方法就是设置全屏幕用的。
事件处理
监听器:
ActionListener
方法:
actionPerformed
事件:
ActionEvent
●StringgetActionCommand()
actioncommand是控件内部的一个字符串,用于标识控件的状态。
此函数可以取得控件的状态,从而决定到底该做什么。
●intgetModifiers()
取得“产生此事件时,用户同时按下的组合键”
●longgetWhen()
取得“产生此事件时的时间戳”
事件产生原因:
点击按钮,在列表框中选择内容,在文本框中点回车,计时器到期
AdjustmentListener
adjustmentValueChanged
AdjustmentEvent
●AdjustablegetAdjustable()
adjustable是一个接口,各种滚动条都实现了这个接口。
●intgetAdjustmentType()
取得滚动类型,共有UNIT_INCREMENT,UNIT_DECREMENT,BLOCK_INCREMENT,BLOCK_DECREMENT,TRACK共5种类型
●intgetValue()
取得滚动滑块的当前值
滚动条的滚动
ItemListener
itemStateChanged
ItemEvent
●ObjedtgetItem()
取得被选中的元素。
注意,返回值是Object,还应该进行强制类型转换。
●ItemSelectablegetItemSelectable()
ItemSelectable是一个接口,代表那些包含了n个可供选择的子元素的对象。
此方法返回产生此事件的对象。
此方法的作用主要在于,如果一个列表框是允许多选的,那么上面的方法就不好用了,应该用此方法得到列表对象,再取得被选中的多个元素。
●intgetStateChange()
取得选择的状态,是SELECTED还是DESELECTED
各种按钮的点击,列表框的选择
FocusListener
focusGained、focusLost
FocusEvent
●ComponentgetOppositeComponent()
得到“参与焦点变换的”另一个对象。
如果是焦点取得事件,则返回之前拥有焦点的对象;
如果是焦点失去事件,则返回得到焦点的对象。
若焦点转移到另外一个应用程序,返回null
●booleanisTemporary()
焦点是临时性转移还是永久转移。
临时性转移:
用鼠标拖动窗口或者窗口变为非激活状态。
其他为永久性转移。
各种组件的焦点变化
KeyListener
keyPressed、keyReleased、keyTyped
KeyEvent
●chargetKeyChar()
此方法只在keytyped中有效,返回按下的字符。
比如按下shift+a,返回'
A'
●intgetKeyCode()
取得键盘上按键的整数编码。
请注意,是键盘上的按键,比如F1,Ctrl,Home键等等,都有相应编码。
不支持组合键,也就是说“Shift+a”和“a”返回同样的内容,都是小写a的ASCII码。
但是大键盘的数字键和小键盘的数字键返回内容不同。
●staticStringgetKeyModifiersText(intmodifiers)
将掩码转化为字符串,比如“Ctrl”,“Ctrl+Shift”等。
注意它是static方法
●staticStringgetKeyText(intkeyCode)
返回keyCode代表的按钮的名字,比如"
Home"
,"
F1"
等。
注意它是statci方法
在各种组件上敲击键盘
MouseListener
mouseClicked、mousePressed、mouseReleased
mouseEntered、mouseExited
MouseEvent
●PointgetLocationOnScreen()
返回鼠标相对于显示屏幕的绝对坐标(Java1.6版提供)
●intgetXOnScreen()
返回鼠标相对于显示屏幕的X的绝对坐标(java1.6版提供)
●intgetYOnScreen()
返回鼠标相对于显示屏幕的Y的绝对坐标(java1.6版提供)
●PointgetPoint()
返回鼠标相对于组件的绝对坐标
●intgetX()
返回鼠标相对于组件的X的绝对坐标
●intgetY()
返回鼠标相对于组件的Y的绝对坐标
●voidtranslatePoint(intx,inty)
给鼠标的做用点加上一个偏移量。
比如2个参数分别是10,20,你要用鼠标画直线,当你鼠标指向100,100开始画,实际上的线是画在110,120处
●intgetClickCount()
产生此事件时鼠标共点击了多少下(单击、双击、三击……)
●intgetButton()
产生此事件时,鼠标的哪个键被点击了:
NOBUTTON,BUTTON1,BUTTON2或者BUTTON3
●booleanisPopupTrigger()
是否能够触发一个弹出式菜单。
由于各平台触发弹出式菜单的情况不一样,因此应该在mousePressed和mouseReleased中都检测一下
在任何组件上点击鼠标、将光标移动进来或出去
MouseMotionListener
mouseDragged、mouseMoved
在任何组件上移动鼠标
MouseWheelListener
mouseWheelMoved
MouseWheelEvent
●intgetScrollType()
滚动的类型,是按块滚动WHEEL_BLOCK_SCROLL还是按单位滚动WHEEL_UNIT_SCROLL
●intgetScrollAmount()
返回为相应此事件应该滚动的单位数。
此方法有效的前提是按单位滚动。
●intgetWheelRotation()
鼠标滚轮滚动过程中”咔嚓“声的数目。
向上滚为负值,向下滚为正值
在任何组件上滚动鼠标中键
WindowListener
windowOpened、windowClosing、windowClosed、windowIconified
windowDeiconified、windowActivated、windowDeactivated
WindowEvent
●WindowgetWindow()
返回发生此事件的window对象
●WindowgetOppositeWindow()
若发生了焦点转移,返回另一个参与此事件的window对象,或者null
●intgetOldState()
窗口变化前的状态:
NORMAL、ICONIFIED、MAXIMIZED_BOTH
●intgetNewState()
窗口变化后的状态
窗口发生变化
WindowFocusListener
windowGainedFocus、windowLostFocus
窗口得到或失去焦点
WindowstateListener
WindowstateChanged
窗口状态改变
四、代码分析
packageimust.imageprocessing;
importjava.awt.image.*;
importjava.io.File;
importjava.io.FileFilter;
importjava.io.IOException;
importjavax.imageio.ImageIO;
publicclassImageProcessingextendsJFrame{
Stringfilepath="
"
;
Stringfilename="
Filefile2;
BufferedImagebuffimg=null;
ImageIconic;
Imageia,l;
JLabeljLabel1=null;
BorderLayoutborderLayout1=newBorderLayout();
JMenuBarjmb=newJMenuBar();
JMenufile,edit,view,suofang,gray,see,save,move,niuqu;
publicImageProcessing(Stringtitle){
super(title);
file=newJMenu("
文件"
JMenuItemdakai=newJMenuItem("
打开"
dakai.addActionListener(newdakai_actionAdapter(this));
file.add(dakai);
file.addSeparator();
JMenuItemtuichu=newJMenuItem("
退出"
tuichu.addActionListener(newtuichu_actionAdapter(this));
file.add(tuichu);
jmb.add(file);
suofang=newJMenu("
缩放"
JMenuItemsuoxiao=newJMenuItem("
缩小"
suoxiao.addActionListener(newtestImage_suoxiao_actionAdapter(this));
this.getContentPane().setLayout(borderLayout1);
suofang.add(suoxiao);
suofang.addSeparator();
JMenuItemfangda=newJMenuItem("
放大"
fangda.addActionListener(newtestImage_fangda_actionAdapter(this));
suofang.add(fangda);
jmb.add(suofang);
edit=newJMenu("
旋转"
JMenuItemxuanzhuan90=newJMenuItem("
旋转90度"
xuanzhuan90.addActionListener(newxuanzhuan90_actionAdapter(this));
edit.add(xuanzhuan90);
edit.addSeparator();
JMenuItemxuanzhuan180=newJMenuItem("
旋转180度"
xuanzhuan180.addActionListener(newxuanzhuan180_actionAdapter(this));
edit.add(xuanzhuan180);
JMenuItemxuanzhuan270=newJMenuItem("
旋转270度"
xuanzhuan270.addActionListener(newxuanzhuan270_actionAdapter(this));
edit.add(xuanzhuan270);
jmb.add(edit);
gray=newJMenu("
图像灰度处理"
JMenuItemhuidu=newJMenuItem("
灰度变换"
huidu.addActionListener(newhuidu_actionAdapter(this));
gray.add(huidu);
gray.addSeparator();
JMenuItemjunhenghua=newJMenuItem("
直方图均衡化"
junhenghua.addActionListener(newjunhenghua_actionAdapter(this));
gray.add(junhenghua);
jmb.add(gray);
//////////////////zyf/////////////////////////////
see=newJMenu("
变形"
JMenuItemlashen=newJMenuItem("
拉伸"
lashen.addActionListener(newtestImage_lashen_actionAdapter(this));
see.add(lashen);
see.addSeparator();
JMenuItemzhankuan=newJMenuItem("
展宽"
zhankuan.addActionListener(newtestImage_zhankuan_actionAdapter(this));
see.add(zhankuan);
jmb.add(see);
niuqu=newJMenu("
扭曲"
JMenuItemniuqu1=newJMenuItem("
niuqu1.addActionListener(newtestImage_niuqu1_actionAdapter(this));
niuqu.add(niuqu1);
niuqu.addSeparator();
jmb.add(niuqu);
save=newJMenu("
保存"
JMenuItemsaveas=newJMenuItem("
另存为"
saveas.addActionListener(newsaveas_actionAdapter(this));
save.add(saveas);
save.addSeparator();
jmb.add(save);
move=newJMenu("
移动"
JMenuItemlmove=newJMenuItem("
向左移动"
lmove.addActionListener(newtestImage_lmove_actionAdapter(this));
move.add(lmove);
move.addSeparator();
JMenuItemrmove=newJMenuItem("
向右移动"
rmove.addActionListener(newsaveas_actionAdapter(this));
move.add(rmove);
jmb.add(move);
//////////////////zyf/////////////////////////////
view=newJMenu("
关于"
JMenuItembanben=newJMenuItem("
版本说明"
banben.addActionListener(newbanben_actionAdapter(this));
view.add(banben);
jmb.add(view);
//zyf
this.setSize(800,600);
this.setJMenuBar(jmb);
jLabel1=newJLabel("
JLabel.CENTER);
JScrollPanepane=newJScrollPane(jLabel1);
this.add(pane,borderLayout1.CENTER);
this.setVisible(true);
publicstaticvoidmain(String[]args){
ImageProcessingtestImage1=newImageProcessing("
基于J2SE的数字图像处理软件"
testImage1.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
});
//////////////////通过文件选择对话框打开图片并显示\\\\\\\\\
voiddakai_actionPerformed(ActionEvente){
JFileChooserchooser=newJFileChooser();
if(JFileChooser.APPROVE_OPTION==chooser.showOpenDialog(this))
{
S