创建简单的用户界面
Java通过使用Swing来支持可视化的软件,Swing是Java类的集合,它可以表示所有不同的按钮、文本框、滑块,以及可以成为GUI一部分的其他组件,同时还包括了可以从上述组件中接收用户输入的类。
1、Swing和抽象窗口工具包
Java是一种跨平台语言,使用它可以为很多不同的操作系统编写程序,因此其图形用户软件必须是灵活的,不仅能够支持Windows和Mac窗口风格,还必须能够盲足其他平台的要求。
在Java中,使用两组类来开发程序的用户界面:Swing和抽象工具包(Abstract Windowing Toolkt , AWT)。这些类让你能够创建图形用户界面以及接受用户输入。
Swing提供了编写使用图形界面的程序所需要的一切。使用Java的用户界面类,可以创建包括下述元素的GUI:
按钮、复选框、标签和其他简单组件;
文本框、滑块和其他复杂组件;
下拉菜单和弹出菜单;
窗口、框架、对话框和applet窗口。
2、使用组件
在Java中,图形用户界面的每部分都由Swing包中的一个类表示。对于按钮,是JButton类、窗口是JWindow类、文本框是JtextField类等。
组织图形用户界面时,需要使用两类对象:组件和容器。组件是用户界面中的独立元素,如按钮或滑块;容器则是用于容纳其他组件的组件。
创建界面的第一步是创建能够容纳组件的容器。在应用程序中,该容器通常是窗口或框架。
1)、窗口和框架
窗口和框架是能够在用户界面上显示,并可以容纳其他组件的容器。这些容器分别是使用Swing包中额 JWindow和JFrame类创建的。创建前需要导入javax.swing.*包,当然现在的开发软件都自动添加。
一种在Java应用程序中使用框架的方法是,将应哦也难怪程序声明为JFrame的子类,这样应用程序将继承作为框架所需的行为。创建框架时必须在框架的构造函数中执行几种操作:
调用超类JFrame的构造函数;
设置框架的标题;
设置框架的大小;
设置框架的外观;
定义用户关闭框架时应执行的操作。
还必须显示框架,除非由于某种原因,在应用程序开始运行时不显示框架。
所有这些操作都可以在框架的构造函数中完成。
当使用Swing创建了图形用户界面时,可以对它的外观进行自定义,从而控制按钮和其他组件的显示方式和行为。Java7中引用了增强的外观,名为Nimbus,当其在类中使用时,必须先启用。通过调用Swing包中的UIManager类的setLookAndFeel()方法可以设置我外观。下面来看一个完整的实例:
public class JavaApplication1 extends JFrame
{
public JavaApplication1()
{
setTitle("使用setTile可以指定窗口的名称");
setLookAndFeel();
setSize(300, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void setLookAndFeel()
{
try {
UIManager.setLookAndFeel("som.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
}
}
public static void main(String[] args)
{
JavaApplication1 application1 = new JavaApplication1();
}
}
2)、按钮
JButton和其他组件一样,也位于java.awt.swing包中。Jbutton对象是一个可以单击的按钮,其标签描述了单击按钮的结果。该标签可以使文本、图像或两者的组合。下面的语句创建一个名为onButton的JButton对象,并将其标签设置为OK:
JButton okButton = new JButton(“OK”);
创建好JButton等组件后。应调用add()方法将其加入到容器中:
add(okButton);
在容器中添加组件时,不需要致命组件在容器中显示的位置,组件的布局由被称为布局管理器的对象决定。最简单的布局管理器是FlowLayout类,它位于java.awt中。
要让容器使用特定不布局管理器,必须首先创建该布局管理器的对象。使用下面的语句创建FlowLayout对象:
FlowLayout fl = new FlowLayout();
创建好后,调用其setLayout()方法将其管理器同容器关联起来,该方法将布局管理器对象作为唯一的参数:
Pane.setLayout(flo);
这条语句将flo对象指定为容器pane的布局管理器。
接下来要创建的应用程序为Playback类,它可以显示一个包含3个按钮的框架:
public class Playback extends JFrame{
public Playback() throws HeadlessException {
super("这是Playback类");
setSize(225 , 80);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout flowLayout = new FlowLayout();
setLayout(flowLayout);
JButton button1 = new JButton("开始");
JButton button2 = new JButton("停止");
JButton button3 = new JButton("暂停");
add(button1);
add(button2);
add(button3);
setVisible(true);
}
public static void main(String[] args)
{
Playback playback = new Playback();
}
}
3)、标签和文本框
Jlable组件显示用户不能修改的休息,这种信息可以是文本、图形或两者的组合。这些组件常用于标识界面中的其他组件,因此而得名。
JTextField组件是用户可以输入单行文本的区域。创建时可以设置其宽度。
下面的语句创建一个JLable组件和一个JTextField对象,并将它们加入到容器中:
JLabel jLabel = new JLabel("网页地址" , JLabel.RIGHT);
JTextField jTextField = new JTextField(20);
add(jLabel);
add(jTextField);
对象包含的文本可使用方法getText()来获取,使用setText()来设置:
String str = jLabel.getText();
jLable.setText(“小武灵灵”);
4)、复选框
JcheckBox组件由文件和方框组成,用户可以选中它。下面的语句创建了一个JcheckBox对象,并将其加入到容器中:
JCheckBox checkBox = new JCheckBox("要不要选中我啊?" , true);
add(checkBox);
第二个参数设置复选框是否默认选中
JCheckBox可以单个显示,也可以编成组。在一组复选框中不能同时选中多个。要使JCheckBox对象成为某个组的一部分,必须创建一个ButtonGroup对象,如下:
5)、组合框
JComboBox组件是一个弹出式选择列表,也可以设置成能够接收文本输入。在这种情况下,用户可以使用鼠标选中列表项,也可以使用键盘来输入文本。组合框有点像一组复选框,但在没有打开列表时,只能看见其中的一个选项。
要创建JcomboBox对象,必须在创建这种对象后加入每个选项,如下所示:
JComboBox comboBox = new JComboBox();
for (int i = 0; i < 10; i++) {
comboBox.addItem("第" + (i+1) + "项");
}
add(comboBox);
要让JComboBox能接收文本输入,必须使用true参数调用其setEditable()方法:
comboBox.setEditable(true);
6)、文本区域
JtextArea组件允许用户输入多行文本,你可以指定该组件的宽高。下面的语句创建一个JTextArea组件,其宽度大约为40个字符,高度为8行:
JTextArea textArea = new JTextArea("文本框一共5行6列", 5, 6);
add(textArea);
文本区域组件的行为可能与读者预期的不同:用户达到文本区域底部时,它自动增大,文本区域的底部和右边无滚动条。要实现类似于其他窗口软件中的文本区域,必须将文本区域放在被称为滚动窗格的容器中,这个将在以后讲到。
7)、面板
面板是使用Swing中的JPanel类创建的。JPanel对象是可以再Swing界面中使用的最简单的容器,用于将显示区域划分成不同的容器组。将显示区域分成几部分后,可以采用不同的规则来组织每个部分。
JPanel panel = new JPanel();
add(panel);
当需要在界面中包含绘画区域时,也可以使用面板。JPanel的另一种用途是,用于创建可加入到其他类中的组件。
3、创建自己的组件
面向对象编程的一个主要优点是,能够在不同的项目中重用类。下面我们将创建一个特殊的面板组件,可在其他Java程序中重用它,该组件名为ClockPanel,是JPanel的子类,代码如下:
ClockPanel.java
public class ClockPanel extends JPanel{
public ClockPanel() {
super();
String currentTime = getTime();
JLabel time = new JLabel("当前时间是:");
JLabel current = new JLabel(currentTime);
add(time);
add(current);
}
final String getTime() {
String time;
Calendar now = Calendar.getInstance();
time = now.get(Calendar.YEAR) + "年" + now.get(Calendar.MONTH) + "月" + now.get(Calendar.DAY_OF_MONTH) + "日" + now.get(Calendar.HOUR_OF_DAY) + "时" + now.get(Calendar.MINUTE) + "分" + now.get(Calendar.SECOND) + "秒";
return time;
}
}
ClockFrame.java
public class ClockFrame extends JFrame{
public ClockFrame() throws HeadlessException {
super("创建自定义组件");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout layout = new FlowLayout();
setLayout(layout);
ClockPanel clockPanel = new ClockPanel();
add(clockPanel);
setVisible(true);
}
public static void main(String[] args)
{
ClockFrame clockFrame = new ClockFrame();
}
}
我们发现getTime()方法带有final关键字,这是因为其可以防止它被子类中的方法覆盖。这对GUI组件来说是必须的。