11.5.4 编程步骤(一)
1. 导入Swing包
首先必须导入Swing包:
import javax.swing.*;
在大多数Swing程序,可能还需要导入两个主要的AWT包:
import java.awt.*;
import java.awt.event.*;
2. 设置Look and Feel
Swing允许在程序中指定Look and Feel,即:Java look and feel,Windows look and feel和CDE/Motif look and feel等。可以使用UIManaer.setLookAndFeel方法指定Look and Feel,在下面的代码段中,使用getCrossPlatformLookAndFeelClassName方法得到跨平台的Look and Feel(即Java look and feel).
public static void main(String[]args)
{
try{
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
}catch(Exception e) { }
…//Create and show the GUI…
}
如果希望使用程序当前运行的平台所用的Look and Feel,可以使用UIManager.getSystem LookAndFeelClassName方法。当然,还可以直接使用实际的类名来指定,例如:
UIManager.setLookAndFeel(
“com.sun.java.swing.plaf.windows.windowsLookAndFeel”);
总的来说,对于UIManager.setLookAndFeel方法,可以使用下面的参数来设置look and feel:
★UIManager.getCrossPlatformLookAndFeelClassName()
返回一个在任何平台都肯定能正常工作的Look and Feel,即Java look and feel.
★UIManager.getSystemLookAndFeelClassName()
指定当前平台所使用的Look and Feel。在Win32平台,则指定为Windows lood and feel;在Mac OS平台,为Mac OS look and feel;在Sun平台,为CDE/Motiflook and feel.
★“javax.swing.plaf.metal.MetalLookAndFeel”
指定为Java look and feel,它与UIManager.getCrossPlatformLookAndFeelClassName()方法相同。
★“com.sun.java.swing.plaf.windows.Windows.WindosLookAndFeel”
指定为CDE/Motif look and feel,可以在任何平台上使用。
★“java.swing.plat.mac.MacLookAndFeel”
指定为Mac OS look and feel,它公适用Mac OS平台。
当然,还可以使用其他参数,执行在UIManager.aetLookAndFeel方法中指定相应的类名。
在设置了Look and feel之后,还可以使用下面的代码来改变Look and Feel:
UIManager.setLookAndFeel(InfName);
SwingUtilities.rpdateComponentTreeUI(frame);
Frame.pack();
如果每次都使用固定的Look and Feel,还可以通过在程序之外设置环境变量来实现。在J2SE的HOME目录(例如c:\jdk1.3)下,找到lib子目录,创建一个文件swing.properties(如果不存在),在文件中加入类似于下面的内容:
#Swing properties
swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
3. 设置顶层容器
在Swing GUI程序中,至少应含有一个顶层Swing容器。对于大多数程序而言,顶层的Swing容器是Jframe,Jdialog或Japplet(对于Applet)。每一个Jframe对象实现一个主窗口,每一个Jdialog对象实现一个二级窗口,每一个Japplet对象在浏览器窗口中实现一个Applet的显示域。顶层Swing容器向其上的Swing组件提供了绘画和事件处理的支持。
在11.5.3小节例子中,SwingApplication仅使用了一个顶层容器,即Jframe,当用户关闭该frame,应用程序将退。
public class SwingApplication
{
//其他代码…
public static void main(String[]args)
{
//其他代码…
Jframe frame = new Jframe(“SwingApplication”);
//…create the components to go into the frame…
//…stick them in a container named contents…
frame.getContentPane().add(contensts,BorderLayout.CENTER);
//Finish setting up the frame,and show it.
frame.addWindowsListener(…);
frame.pack();
frame.setVisible(true);
}
}
在11.5.3小节例子中,创建了四个Swing组件:主窗口frame,一个顶层窗口,它的存在主要是提供一个放置其他组件的空间:panel是一个中间层容器,它的惟一目的是简化button和label位置的确定,利于组件的布局:button和label属于原子型的组件,它们不能再含有其他任何组件。通常,这些原子型组件被用于接收用户的输入。Swing API提供了许多原子型组件,掌握这些组件的特性和用法是学习Swing编程最主要的内容。
【图】是这四个组件的层次结构图。
从上图可以看出,即使是最简单的Swing程序,也会包含多个层次,其根总是顶层容器,其他所有容器或组件都被放置在根容器中。
每一个顶层容器间接地含有一个中间层容器,称为内容板(content pane)。对于大多数程序,我们无需知道在顶层容器和内容板之间有些什么。内容板直接或间接地含有所有可见的组件,但是,如果顶层容器有一个菜单条,那么,菜单条通常被放置在内容板之外的某个位置。
增加一个组件到一个容器,可以使用add方法。Add方法至少应有一个参数,即需增加的组件,而且,有时可能还需要另外一个参数来提供布局信息。
11.5.4 编程步骤(二)
4. 设置组件
在例11.17中,SwingApplication GUI含有一个button和一个label,下面是button的初始化代码:
Jbuton button = new Jbutton(“I’m a Swing button!”);
Button.setMnemonic(keyEvent.VK-I);
Button.addActionListener(…create an action listener…);
代码段中,第1行是创建按钮对象;第2行是设置用户按下键盘的哪一个键等于是按下该按钮;第3行是为该按钮的点击登记事件处理器。
下面的代码段是初始化或操作label:
…//where instance variables are declared:
private static String labelPrefix = “Number of button clicks:”;
private int numClicks = 0;
…//in GUI initialization code:
final Jlabel label = new Jlabel(labelPrefix+”0 ”);
…
label.aetLabelFor(button);
…//in the event handler for button click:
label.setText(labelPrefix+numClicks);
5. 增加组件到容器
在例12.17中,SwingApplication在将组件增加到frame之前,将button和label编成一组放入Jpanel容器中,代码如下:
Jpanel pane = new Jpanel();
Pane.setBorder(BorderFactory.createEmptyBorder(30,30,10,30));
Pane.setLayout(new GridLayout(0,1));
Pane.add(button);
Pane.add(label);
代码段的第1行是创建 一个Jpanel对象pane;第2行为Jpanel对象增加一人边界;第3行是设置一个布局管理器,最后两行是将button和label增加进pane中。
6. 事件处理
在例12.17中,SwingApplication有两个事件处理器,分别处理button的点击和窗口的关闭:
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
numClicks++;
label.setText(labelPrefix+numClicks);
}
}
);
//其他代码…
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
|
文章
|
8563
|
创建日期
|
8-5-2011
|
作者
|
lincs
|
评分
|
(None)
|
|