JavaSwing.docx
《JavaSwing.docx》由会员分享,可在线阅读,更多相关《JavaSwing.docx(13页珍藏版)》请在冰豆网上搜索。
![JavaSwing.docx](https://file1.bdocx.com/fileroot1/2022-12/14/fb0c5b5a-5ec5-465e-9922-06d2b020c41d/fb0c5b5a-5ec5-465e-9922-06d2b020c41d1.gif)
JavaSwing
JavaSwing组件技术
1、简介
(1)JFCSwing:
它是AWT的扩展。
它比AWT提供了更多的组件和外观。
是Sun公司的新一代的图形界面的标准。
Swing组件的实现不包括任何于平台相关的代码,它是纯Java代码,因此与平台无关。
(2)AWT的优、缺点:
AWT提供了构造Applet和Application图形用户界面的基本类库。
通过采用“本地对等端”(nativepeer)模型,即AWT中的每一个可视化GUI组件都有一个相应的本地对等端来负责它的显示与外观,从而解决了跨各种软硬件平台显示GUI的问题,为Java最初的成功奠定了基础。
AWT的“本地对等端”模型,满足了当时开发人员希望Java在不同平台上运行时,具有本地显示风格的要求,但同时也带来了一些问题:
●“本地对等端”模型给GUI的绘画和事件处理带来了很多限制,使得某些方面的GUI编程很难实现:
如采用透明背景色、改变GUI组件外形为其他形状等。
●AWT提供的是本地显示风格,但是随着Internet的普及,更多的开发人员希望网络应用能够具有一致的显示风格。
(3)JavaSwing的产生:
为解决AWT的“本地对等端”模型带来的问题,Sun公司与Netscape、IBM合作共同开发了新一代Java图形类库—JFC(JavaFoundationClass)。
JFC实际上是AWT的超集,它提供了更丰富的GUI组件和更强的图形/图像处理能力,而且JFC完全向下兼容AWT的应用。
(4)JavaSwing的优点:
Swing组件全部是“轻型”组件(即不需要“本地对等端”的组件),具备“可插接的外观和感觉”特性(可以动态改变)。
2、主要的包与组件类、事件类与接口
Swing提供了一套丰富的“轻型”GUI组件,定义在javax.swing包中。
Swing组件涵盖了AWT中业已提供的GUI组件,这些组件的类名即是AWT的组件类名加上前缀“J”。
其中基本GUI组件新增加了JTable、JTree、JSlide、JProgressBar、JToolTip以及JFileChooser和JColorChooser,并将Choice组件更名为大家熟悉的ComboBox;而容器组件则新增加了JSplitPane、JTabbedPane、JToolBar、JInternalFrame和JLayeredPane。
其各个组件都是JComponent的子类,主要有AbstractButton,BasicInternalFrameTitlePane,Box,Box.Filler,JColorChooser,JComboBox,JFileChooser,JInternalFrame,JInternalFrame.JDesktopIcon,JLabel,JLayeredPane,JList,JMenuBar,JOptionPane,JPanel,JPopupMenu,JProgressBar,JRootPane,JScrollBar,JScrollPane,JSeparator,JSlider,JSpinner,JSplitPane,JTabbedPane,JTable,JTableHeader,JTextComponent,JToolBar,JToolTip,JTree,JViewport。
Swing组件,无论是基本组件还是容器组件,都沿用了AWT(JDK1.1)的事件处理模型。
除了java.awt.event包中定义的事件类和事件监听器接口,Swing还在javax.swing.event包中为新增加的组件定义了相应的事件类和事件监听器接口。
此外,为了满足商业化桌面应用的需求,同时简化应用的开发和部署,Swing还定义了一套新的高层次的GUI组件。
3、注意的问题
由于Swing中的各个组件类与AWT的组件类有相同的基类,所以可以在同一界面中同时使用Swing与AWT。
但有时可能不能正常显示,最好不要合用。
4、Swing的“外观和感觉”(LookandFeel)Swing提供了三种“外观和感觉”,即Windows系统、MotifXWindow系统(UNIX下)和Metal(Swing的新的交平台,为JavaSwing的缺省方式)。
通过LookandFeel机制,我们可以使程序的设计者任意转换程序的人机界面来对应不同的操作系统平台。
设置方法(请见LookAndFeelTest.java、FrameLook.java动态地改变外观):
(1)使用Swing的新的交平台:
当采用该“外观和感觉”时,将使Java程序在不同的系统平台上表现出相同的外观,因为JVM调用相同的类库。
try{
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
}
catch(Exceptionexc)
{
System.err.println("ErrorloadingL&F:
"+exc);
}
(2)使用目标系统平台的外观,如在Windows系统下为Windows的外观即自适应功能。
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//在此方式下不支持中文
}
catch(Exceptionexc)
{
System.err.println("ErrorloadingL&F:
"+exc);
}
(3)强制为某一种系统平台
①Windows系统
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch(Exceptionexc)
{
System.err.println("ErrorloadingL&F:
"+exc);
}
②UnixXWindow系统平台
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
}
catch(Exceptionexc)
{
System.err.println("ErrorloadingL&F:
"+exc);
}
③SwingMetal系统
try{
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
}
catch(Exceptionexc)
{
System.err.println("ErrorloadingL&F:
"+exc);
}
(4)动态地改变程序的LookandFeel
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);//对由this所指示的组件重新设置外观
注意:
由于JFrame、JApplet等为重量级组件,因此它的外观只与操作系统平台有关系,在相同的操作系统平台下表现出相同的外观。
5、在Swing容器中添加组件
对JFrame与JApplet等顶级的容器,在添加组件时与AWT不同点是不能直接调用容器的add()方法,而是
(1)获得当前容器的内容面板对象,利用getContentPane()(其定义为publicContainergetContentPane()),再调用容器的add()方法来加人各个其它组件;
(2)先利用JPanel类生成一个内容面板对象,并将各个组件加入该内容面板对象中,然后再调用setContentPane()方法(其定义为publicvoidsetContentPane(ContainercontentPane))将内容面板对象加入到当前容器中。
6、容器组件的编程应用
(1)JFrame:
它为Frame的升级,代表应用程序的主窗口。
编程的基本方法为:
创建JFrame类的子类;在自己的子类的构造函数中调用上层基类的构造函数;设置窗口的大小;设置在用户关闭窗口时则应该完成什么行为;最后显示出窗口。
importjavax.swing.*;
publicclassJFrameTestextendsJFrame
{
publicJFrameTest(Stringtitle)
{super(title);
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
publicstaticvoidmain(Stringarg[])
{
JFrameTestjframe=newJFrameTest(“这是我的窗口标题条文字”);
}
}
注意:
setDefaultCloseOperation()是决定在用户关闭窗口时,完成什么行为。
在JFrame类中定义出了4个常量:
staticintDISPOSE_ON_CLOSE(释放窗口)、staticintDO_NOTHING_ON_CLOSE(不做什么事情)、staticintEXIT_ON_CLOSE(退出)、staticintHIDE_ON_CLOSE(隐藏窗口)。
(2)菜单条式菜单:
通过JMenuBar类(利用setJMenuBar()方法加入窗口中)、JMenu(级联)、JMenuItem(菜单项目)、JCheckBoxMenuItem(选择性的菜单项目)、JRadioButtonMenuItem(选择性的菜单项目但为圆点)。
●mnuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
//产生快捷键
●mnuFile.addSeparator();//添加分割条
●mnuFileNew.setIcon(newImageIcon(".\\images\\new.gif"));//给菜单加上图标
●mnuFile.setMnemonic('F');//给菜单加上助记符
●要使得多个JRadioButtonMenuItem项目产生单选的效果,可以将它们放入一个ButtonGroup组件中;否则为多选效果。
(3)工具条JToolBar
在Swing中的窗口工具条是由JToolBar来实现,它也是一种容器并按照行或列对组件(它们一般为按钮)进行分组。
缺省时为水平方向但可以使用SwingConstants.HORIZONTAL或者SwingConstants.VERTICAL来设置其方向。
(1)构造函数:
JToolBar()创建出水平方向的工具条(缺省为HORIZONTAL)。
JToolBar(intorientation)创建出指定方向的工具条。
JToolBar(Stringname)创建出指定名称的工具条。
JToolBar(Stringname,intorientation)创建出指定方向和名称的工具条。
(2)编程方法:
创建出JToolBar对象,然后采用add(Object)方法将组件(可以为按钮或其它组件)加入到工具条中。
(3)可移动的工具条:
可移动的工具条必须使用BorderLayout布局管理器来安排其ContentPane内容面板,并且工具条只能放置在上、下、左、右四个方向之一。
此时只有ContentPane容器的中心区域能够放置其它组件,否则将不能移动工具条到该方向上;调用setFloatable(true)设置为可拖动效果。
(4)工具条上的工具按钮的事件编程:
类似于一般的按钮事件编程,可以分别为各个不同的按钮单独进行事件编程。
(5)编程实例:
(4)标准对话框:
Swing中提供了JOptionPane类来实现类似Windows平台下的MessageBox的功能,同样在Java中也有,利用JOptionPane类中的各个static方法来生成各种标准的对话框,实现显示出信息、提出问题、警告、用户输入参数等功能。
这些对话框都是模式对话框。
ConfirmDialog---确认对话框,提出问题,然后由用户自己来确认(按“Yes”或“No”按钮)
InputDialog---提示输入文本
MessageDialog---显示信息
OptionDialog—组合其它三个对话框类型。
这四个对话框可以采用showXXXDialog()来显示,如showConfirmDialog()显示确认对话框、showInputDialog()显示输入文本对话框、showMessageDialog()显示信息对话框、showOptionDialog()显示选择性的对话框。
它们所使用的参数说明如下:
①ParentComponent:
指示对话框的父窗口对象,一般为当前窗口。
也可以为null即采用缺省的Frame作为父窗口,此时对话框将设置在屏幕的正中。
②message:
指示要在对话框内显示的描述性的文字
③Stringtitle:
标题条文字串。
④Component:
在对话框内要显示的组件(如按钮)
⑤Icon:
在对话框内要显示的图标
⑥messageType:
一般可以为如下的值ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE、
⑦optionType:
它决定在对话框的底部所要显示的按钮选项。
一般可以为DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION。
使用实例:
显示MessageDialog
JOptionPane.showMessageDialog(null,"在对话框内显示的描述性的文字","标题条文字串",JOptionPane.ERROR_MESSAGE);
显示ConfirmDialog
JOptionPane.showConfirmDialog(null,"chooseone","chooseone",JOptionPane.YES_NO_OPTION);
显示OptionDialog:
该种对话框可以由用户自己来设置各个按钮的个数并返回用户点击各个按钮的序号(从0开始计数)
Object[]options={"确定","取消","帮助"};
intresponse=JOptionPane.showOptionDialog(this,"这是个选项对话框,用户可以选择自己的按钮的个数","选项对话框标题",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[0]);
if(response==0)
{this.setTitle("您按下了第OK按钮");
}
elseif(response==1)
{this.setTitle("您按下了第Cancel按钮");
}
elseif(response==2)
{this.setTitle("您按下了第Help按钮");
}
显示InputDialog以便让用户进行输入
StringinputValue=JOptionPane.showInputDialog("Pleaseinputavalue");
显示InputDialog以便让用户进行选择地输入
Object[]possibleValues={"First","Second","Third"};//用户的选择项目
ObjectselectedValue=JOptionPane.showInputDialog(null,"Chooseone","Input",JOptionPane.INFORMATION_MESSAGE,null,possibleValues,possibleValues[0]);
setTitle("您按下了"+(String)selectedValue+"项目");
(5)用户自定义的JDialog对话框:
利用getContentPane().add(child);添加组件。
如果要求设计自己的对话框,可以从JDialog类来派生。
(6)另外Swing中还提供
●实现选择文件的对话框JFileChooser类。
它与FileDialog类有差别(FileDialog类是AWT中的,而JFileChooser类是Swing中的)。
JFileChooser类的使用方法如下:
JFileChooserchooser=newJFileChooser();
chooser.setDialogTitle("将您的文件改名保存");
chooser.setCurrentDirectory(newFile(".\\"));
chooser.setApproveButtonToolTipText("点击该按钮将保存您的文件");
intreturnVal1=chooser.showSaveDialog(this);//采用showOpenDialog(this)将显示出文件打开方式
if(returnVal1==JFileChooser.APPROVE_OPTION)//识别是否按下"OK"
{//获得用户所选择的文件路径与文件名
textBox.append(chooser.getSelectedFile().getAbsolutePath());
}
●JColorChooser颜色选择对话框:
JColorChooserchooserColor=newJColorChooser();
ColoruserSelectColor=chooserColor.showDialog(this,"ColorSelectDialog",Color.red);
if(userSelectColor!
=null)
{
this.setBackground(userSelectColor);
}
要点:
将JColorChooser置于某个容器中,此时创建出JColorChooser类对象并使用ColorSelectionModel接口来管理用户所选择的颜色(利用JColorChooser类中得getSelectionModel()得到ColorSelectionModel接口类的对象,并添加ActionListener事件)。
请见JavaWord中的“格式”菜单
JColorChoosercolorChooser=newJColorChooser();
this.add("Center",colorChooser);
ColorSelectionModelselectModel=colorChooser.getSelectionModel();
selectModel.addChangeListener(this);
●AWT中的文件打印与页面设置对话框
(6)JScrollPane面板
它主要为其它的控件提供Scroll功能。
在Swing中与AWT中实现Scroll功能不同,在AWT中是由组件自己来实现,而在Swing中则是统一由JScrollPane来完成。
即对于需要Scroll要求的组件,必须将它添加到JScrollPane容器中,再将这个JScroolPane容器但代替可Scroll组件而添加到容器中。
其构造函数为JScrollPane(Componentview,intvsbPolicy,inthsbPolicy)其中的vsbPolicy和hsbPolicy代表ScrollBar的使用方式,主要有如下六种常量:
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
JScrollPane.VERTICAL_SCROLLBAR_NEVER
JScrollPane.VERTICAL_SCROLLBAR_ALWAYSJScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
创建的代码如下:
JTextAreatextBox=newJTextArea();
JScrollPanescroll=newJScrollPane(textBox,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
setContentPane(scroll);
(7)选项窗格JTabbedPane
特性:
它表现为一组文件夹页,每个文件夹都有标题(以Windows系统平台下的TabControl控件为例说明)。
类:
采用JTabbedPane类来表示,其内的每个页面为一个Jpanel类或者其子类的对象。
构造函数:
publicJTabbedPane(inttabPlacement,inttabLayoutPolicy)其中Tabplacement可以是JTabbedPane.TOP(表头在上面)、JTabbedPane.BOTTOM(表头在下面)、JTabbedPane.LEFT(表头在左面)、JTabbedPane.RIGHT(表头在右面)。
TablayoutPolicy可以是JTabbedPane.WRAP_TAB_LAYOUT(表头不产生SCROLL效果)、JTabbedPane.SCROLL_TAB_LAYOUT(表头产生SCROLL效果)。
编程方法:
●创建出JTabbedPane类的对象;
●调用addTab()方法加入一个页面组件;
●最后将JTabbedPane类的对象加入到顶级容器的ContentPane中。
其内的组件事件编程:
在各个页面内的组件的事件是独立的,类似于正常的组件事件编程规则。
编程实例:
请见JTabbedPaneTest.java
(8)表格控件JTable
功能:
它提供以行和列的方式来显示数据,并且可以拖动列
构造函数:
JTable(Object[][]rowData,Object[]columnNames)
编程方法:
创建出JTable对象(可以采用表格中的表头数组和数据数组创建出表格、利用实现TableModel接口的类对象)
●再创建出一个JScrollPane对象并指示