Chapter14MyJava教案.docx
《Chapter14MyJava教案.docx》由会员分享,可在线阅读,更多相关《Chapter14MyJava教案.docx(11页珍藏版)》请在冰豆网上搜索。
Chapter14MyJava教案
第一节介绍
Java基础类是关于GUI组件和服务的完整集合,它大大简化了健壮Java应用程序的开发和实现。
JFC主要包含5个API:
AWT,Java2D,Accessibility,Drag&Drop,Swing。
它提供了帮助开发人员设计复杂应用程序的一整套应用程序开发包。
A、Java2D是一图形API,它为Java应用程序提供了一套高级的有关二维(2D)图形图像处理的类。
Java2DAPI扩展了java.awt和java.awt.image类,并提供了丰富的绘图风格,定义复杂图形的机制和精心调节绘制过程的方法和类。
B、AccessibilityAPI提供了一套高级工具,用以辅助开发使用非传统输入和输出的应用程序。
它提供了一个辅助的技术接口,如:
屏幕阅读器,屏幕放大器,听觉文本阅读器(语音处理)等等。
C、Drag&Drop技术提供了Java和本地应用程序之间的互操作性,用来在Java应用程序和不支持Java技术的应用程序之间交换数据。
D、JFC模块的重点在Swing。
Swing用来进行基于窗口的应用程序开发,它提供了一套丰富的组件和工作框架,以指定GUI如何独立于平台地展现其视觉效果。
Swing介绍
Swing提供了一整套GUI组件,为了保证可移植性,它是完全用Java语言编写的。
1)可插的外观和感觉
可插的外观和感觉使得开发人员可以构建这样的应用程序:
它们可以在任何平台上执行,而且看上去就象是专门为那个特定的平台而开发的。
一个在Windows环境中执行的程序,似乎是专为这个环境而开发的;而同样的程序在Unix平台上执行,它的行为又似乎是专为Unix环境开发的。
开发人员可以创建自己的客户化Swing组件,带有他们想设计出的任何外观和感觉。
这增加了用于跨平台应用程序和Applet的可靠性和一致性。
一个完整应用程序的GUI可以在运行时刻从一种外观和感觉切换到另一种。
2)Swing的体系结构
与AWT比较,Swing提供了更完整的组件,引入了许多新的特性和能力。
SwingAPI是围绕着实现AWT各个部分的API构筑的。
这保证了所有早期的AWT组件仍然可以使用。
AWT采用了与特定平台相关的实现,而绝大多数Swing组件却不是这样做的,因此Swing的外观和感觉是可客户化和可插的。
上图显示了JFC各个部分之间的相互关系。
Java2D,Accessibility,Drag&Drop,和AccessibilityAPI是AWT和JFC的一部分,但它们不属于Swing。
这是因为,这些组件使用了一些本地代码,而Swing却不是这样的。
Swing是围绕着一个称为JComponent的新组件构建的,而JComponent则由AWT的容器类扩展而来。
3)Swing的层次结构
下图说明了Swing组件的层次结构:
SwingGUI使用两种类型的类,即GUI类和非GUI支持类。
GUI类是可视的,它从JComponent继承而来,因此称为“J”类。
非GUI类为GUI类提供服务,并执行关键功能;因此它们不产生任何可视的输出。
4)Swing组件
Swing组件主要为文本处理、按钮、标签、列表、pane、组合框、滚动条、滚动pane、菜单、表格和树提供了组件。
其中一些组件如下所示:
JAppletJButton
JComboBoxJOptionPane
JListJLabel
JScrollPaneJTable
JScrollBarJSlider
JTooltipJTree
第二节基本的Swing应用程序
HelloSwing应用程序的输出产生下图所示的窗口:
每次用户点击按钮时,标签就会更新。
1、HelloSwing
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.accessibility.*;
publicclassHelloSwingimplementsActionListener
{
privateJFramejFrame;
privateJLabeljLabel;
privateJPaneljPanel;
privateJButtonjButton;
privateAccessibleContextaccContext;
privateStringlabelPrefix="Numberofbuttonclicks:
";
privateintnumClicks=0;
publicvoidgo()
{
//Hereishowyoucansetupaparticular
//lookAndFeel.Notnecessaryfordefault.
/*
try{
UIManager.setLookAndFeel(UIManager.getLookAndFeel());
}catch(UnsupportedLookAndFeelExceptione){
System.err.println("Couldn'tusethe"+"defaultlookandfeel"+e);
}
*/
jFrame=newJFrame("HelloSwing");
jLabel=newJLabel(labelPrefix+"0");
jButton=newJButton("IamaSwingbutton!
");
//Createashortcut:
makeALT-Abeequivalent
//topressingmouseoverbutton.
jButton.setMnemonic('a');
jButton.addActionListener(this);
//Addsupportforaccessibility.
accContext=jButton.getAccessibleContext();
accContext.setAccessibleDescription("Pressingthisbuttonincrements"+
"thenumberofbuttonclicks");
//Setuppane.
//Giveitaborderaroundtheedges.
jPanel=newJPanel();
jPanel.setBorder(BorderFactory.createEmptyBorder(30,30,10,30));
//Putcomptsinpane,notinJFramedirectly.
jPanel.add(jButton);
jPanel.add(jLabel);
jFrame.setContentPane(jPanel);
//SetupaWindowListenerinnerclasstohandle
//window'squitbutton.
WindowListenerwl=newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente){System.exit(0);}
};
jFrame.addWindowListener(wl);
jFrame.pack();
jFrame.setVisible(true);
}
publicvoidactionPerformed(ActionEvente)
{
numClicks++;
jLabel.setText(labelPrefix+numClicks);
}
publicstaticvoidmain(String[]args)
{
HelloSwinghelloSwing=newHelloSwing();
helloSwing.go();
}
}
注意:
1)
StringwinPlaf="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
StringmetalPlaf="javax.swing.plaf.metal.MetalLookAndFeel";
StringmotifPlaf="com.sun.java.swing.plaf.motif.MotifLookAndFeel";
try{
UIManager.setLookAndFeel(motifPlaf);
}catch(Exceptione){
System.err.println("Couldn'tusethe"+"defaultlookandfeel"+e);
}
2)
jButton.setToolTipText("Pressingthisbuttonincrementsthenumber");
2、导入Swing包
●导入Swing包
●选择外观和感觉
●getLookAndFeel()
●设置窗口容器
●JFrame与Frame相似
●你不能直接将组件加入到JFrame中
●一个contentpane包含了除菜单条外所有Frame的可视组件
语句行importjavax.swing.*装入整个Swing包,它包括了标准Swing组件和功能。
选择外观和感觉
HelloSwing中给定了应用程序外观和感觉的格式。
getLookAndFeel()方法返回在Windows环境中的外观和感觉。
在运行Solaris操作系统的机器上,这个方法则返回一个公共桌面环境(CDE)/Motif的外观和感觉。
因为都是缺省值,所以对本例来说,这些行都不是必需的。
3、建立窗口
Swing程序用JFrame对象实现了它们的窗口。
JFrame类是AWTFrame类的一个子类。
它还加入了一些Swing所独有的特性。
HelloSwing中,处理JFrame的代码如下:
publicHelloSwing()
{
JFramejFrame;
JPaneljPanel;
.....
jFrame=newJFrame("HelloSwing");
jPanel=newJPanel();
.......
jFrame.setContentPane(jPanel);
}
这段代码与使用Frame的代码十分相似。
唯一的区别在于,你不能将组件加入到JFrame中。
你可以将组件加入到JFrame的contentpane中,或者提供一个新的contentpane。
一个contentpane是一个包含除菜单条外所有框架的可视组件的容器。
要获得一个JFrame的contentpane,可使用getContentPane()方法。
要设置它的contentpane(如前面本例所示),则可使用setContentPane()方法。
4、建立Swing组件
Swing应用程序基础
●建立Swing组件
●HelloSwing.java示例实例化了4个Swing组件,这4个组件是:
JFrame,JButton,JLabel和JPanel
●支持辅助技术
●HelloSwing.java示例代码支持辅助技术
accContext=jButton.getAccessibleContext();
accContext.setAccessibleDescription(
"Pressingthisbuttonincrements"+
"thenumberofbuttonclicks.");
HelloSwing程序显式地实例化了4个组件:
JFrame,JButton,JLabel和JPanel。
5、支持辅助技术
HelloSwing.java中唯一支持辅助技术的代码是:
accContext=jButton.getAccessibleContext();
accContext.setAccessibleDescription("Pressingthisbuttonincrements"+
"thenumberofbuttonclicks.");
下列信息集也可由辅助技术使用:
jButton=newJButton("I'maSwingbutton!
");
jLabel=newJLabel(labelPrefix+"0");
jLabel.setText(labelPrefix+numClicks);
在JFrame,JButton,JLabel和其他所有组件中,都有内建的Accessibility支持。
辅助技术可以很容易地获得文本,甚至与一组件某特定部分相关的文本。
第三节构造一个SwingGUI
Swing包定义了两种类型的组件:
1)顶层容器(JFrame,JApplet,JWindow,和JDialog)
2)轻质组件(其他的J…,如JButton,JPanel和JMenu)
顶层容器定义了可以包含轻质组件的框架。
特别地,一个顶层Swing容器提供了一个区域,轻质组件可在这个区域中绘制自身。
顶层容器是它们对应的重质AWT组件的Swing子类。
这些Swing容器依靠它们的AWT超类的本地方法与硬件进行适当的交互。
通常,每个Swing组件在其容器层次结构中都应当有一个位于组件上面的顶层Swing容器。
例如,每个包含Swing组件的Applet都应作为JApplet(而它自身又是java.applet.Applet的一个子类)的子类来实现。
相似地,每个包含Swing组件的主窗口都应用JFrame来实现。
典型地,如果你在使用Swing组件,你将只能使用Swing组件和Swing容器。
Swing组件可以加入到一个与顶层容器关联的contentpane中,但绝不能直接加入到顶层容器中。
contentpane是一个轻质Swing组件,如JPanel。
下面是一个典型Swing程序的GUI容器层次结构图,这个程序实现了一个包含2个按钮,一个文本域和一个列表:
Jframe(atop-levelSwingcontainer)
contentpane
`+---------+-------+
JButtonJButtonJPanel
+---------+
JTextFieldJList
下面是关于同样的GUI的另一个容器层次结构,只是在这里,GUI是在浏览器中运行的一个Applet。
JApplet(atop-levelSwingcontainer)
contentpane
`+---------+-------+
JButtonJButtonJPanel
+---------+
JTextFieldJList
下面是构造如上图所示的GUI层次结构的代码:
第四节JComponent类
所有Swing都作为JComponent的子类来实现,而JComponent类又是从Container类继承而来。
Swing组件从JComponent继承了如下功能:
1、边框
你可以用setBorder()方法来指定在组件周围显示的边框。
还可用一个EmptyBorder的实例来指定一个组件在其周围留有一定的额外空间。
2、双缓冲
双缓冲可以改善一个频繁被改变的组件的外观。
现在你不需要编写双缓冲代码――Swing已为你提供了。
缺省情况下,Swing组件是双缓冲的。
3、提示框
通过用setToolTipText()方法来指定一个字符串,你可以提供给用户有关某个组件的帮助信息。
当光标暂停在组件上时,所指定的字符串就会在组件附近的一个小窗口中显示出来。
4、键盘导航
使用registerKeyboardAction()方法,你可以让用户以键盘代替鼠标来操作GUI。
用户为启动一个动作所必须按下的修饰键与字符的组合,由一个KeyStroke对象来表示。
5、应用程序范围的可插式外观和感觉
每个Java应用程序在运行时刻有一个GUIManager对象,它用于确定运行时刻Swing组件的外观和感觉。
由于安全性的限制,你可以通过调用UIManager.setLookAndFeel()方法选择所有Swing组件的外观和感觉。
在你所看见的东西背后,每个JComponent对象都有一个对应的ComponentGUI对象,它用来执行所有关于该JComponent的绘制、事件处理、大小判定等任务。