第8章 Swing组件
在第7章中,介绍了用AWT创建图形用户界面的基本原理。在java.awt包中,提供了各种具体的组件,如Frame、Panel、Button、Label等。AWT组件的优点是简单、稳定,同时兼容于任何JDK版本,缺点是依赖于本地操作系统的GUI,缺乏平台的独立性。为了实现跨平台,使得用java创建的图形界面在不同操作系统中保持相同的外观,从JKD1.2版本开始引入了Swing组件,这些组件位于javax.swing包中, Swing GUI组件定义了相对于java.awt包更多、更强的功能,可以使用户更加灵活方便的进行GUI的设计。
Swing组件时用纯Java语言编写的,不依赖于本地操作系统的GUI,Swing组件可以跨平台运行。独立于本地平台的Swing组件被称为轻量级组件,而依赖于本地平台的AWT组件被称为重量级组件。
多数Swing组件的父类为javax.swing.JComponent,JComponent 的直接父类为java.awt.Container,与AWT中的Window与Panel处于同一个继承类层次。多数Swing组件类都是以大写字母“J”开头,图8-1显示了Swing组件的类层次结构。从图中可以看出,除JFrame外,其余的Swing组件都继承自JComponent类。

图8-1 Swing组件的类层次结构
8.1 容器组件
8.1.1 JFrame
JFrame是用来替代AWT包中Frame的,可以实现与Frame相同的功能,包括作为容器容纳其他组件,显示组件等。
[例8-1]
import javax.swing.*;
import java.awt.*;
class JFrameTest extends JFrame{
private JButton button1 = new JButton("button1");
private JButton button2 = new JButton("button2");
public JFrameTest(String title){
super(title);//设置标题
this.setBounds(50,50,200,150);
//获得与JFrame关联的contentPane,contentPane默认的布局管理器是BorderLayout
Container contentPane = this.getContentPane();
contentPane.setLayout(new FlowLayout(5));
contentPane.add(button1);
contentPane.add(button2);
this.setVisible(true);
//设置JFrame对关闭按钮的处理方式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
public class Test8_1 {
public static void main(String[] args) {
new JFrameTest("JFrame测试");
}
}
程序运行界面如下:

图8-2 例8-1运行界面
利用JFrame实现了与Frame相同的功能,但JFrame与Frame在使用上还是有很大区别的。
(1)两者都可以添加其他组件到窗口中,Frame直接使用add方法添加相应的组件;JFrame则不能直接通过add方法添加组件,每个JFrame都有一个与之关联的内容面板(contentPane),只能针对这个contentPane添加相应组件。
(2)两者都可以设置布局管理器,Frame直接使用setLayout即可设置;JFrame则需先得到其内容面板,对其内容面板设置布局管理器。
(3)Frame要想关闭窗口需要编写相应的事件处理程序(见例7-12),而JFrame则不必编写事件处理程序,只需调用方法setDefaultCloseOperation(int operation),通过设置operation的值来响应用户关闭窗体的操作,该方法的参数operation的值有以下三个。
JFrame.DO_NOTHING_ON_CLOS:什么也不做
JFrame.HIDE_ON_CLOSE:隐藏窗体,这是JFrame的默认选项
JFrame.EXIT_ON_CLOSE:关闭窗体,结束程序
8.1.2 Jpanel
JPanel是使用最多的组件之一,它是AWT中Panel的替代组件。其默认的布局管理器是FlowLayout布局管理器。
利用JPanel可以实现更为复杂的布局,如BorderLayout布局管理策略,只允许添加5个组件,那么我们可以在5个区域中添加5个JPanel,而每个JPanel又可以根据不同的布局管理策略添加多个组件,只要你愿意,可以添加任意多个你想添加的组件。 [NextPage]
8.1.3 JTabbedPane
当窗口的组件元素过多时,我们可以将这些组件分组放到不同的页面中,java提供了JTabbedPane页签面板来实现。JTabbedPane包含多个选项卡,每个页面和一个选项卡相对应,每个选项卡又是一个容器(一般用JPanel类来封装),可以包含其他的GUI组件,选项卡可以显示图标和文本。当用户选择特定的标签后,就会显示相应的选项卡,并且会触发ChangeEvent事件,该事件由ChangeListener监听器响应。
JTabbedPane提供了如下三个构造方法用于创建JTabbedPane类对象。
表8-1 JTabbedPane构造方法
|
构造方法 |
说明 |
|
public JTabbedPane() |
创建一个具有默认的JTabbedPane.TOP 选项卡布局的空 TabbedPane。 |
|
public JTabbedPane(int tabPlacement) |
创建一个空的 TabbedPane,使其按照tabPlacement值指定选项卡的布局 |
|
public JTabbedPane |
创建一个空的 TabbedPane,使其具有指定的选项卡布局(tabPlacement值指定)和选项卡布局策略(tabLayoutPolicy指定)。 |
构造方法中涉及的两个参数的含义及具体值如下:
tabPlacement:选项卡布局,int枚举类型,值为JTabbedPane.TOP、JTabbedPane.BOTTOM、JTabbedPane.LEFT 或 JTabbedPane.RIGHT,分别表示将标签文本显示在上方、下方、左侧、右侧。
tabLayoutPolicy:一行不能放置所有选项卡标签值时的放置策略,int枚举类型,值为JTabbedPane.WRAP_TAB_LAYOUT 或 JTabbedPane.SCROLL_TAB_LAYOUT。
JTabbedPane.WRAP_TAB_LAYOUT—表示在容器中显示所有标签,如果一排内不能容纳,则把剩下的标签放到下一排。
JTabbedPane.SCROLL_TAB_LAYOUT—只显示一排标签,剩下的标签可以通过滚动图标显示。
[例8-2]中定义了一个JTabbedPaneTest类,在该类中添加了一个 JTabbedPane类对象,为该类对象添加了六个选项卡,程序可以完成点击任何一个选项卡,在窗口下方的JTextField中显示出相应的选项卡的标题。
[例8-2]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class JTabbedPaneTest extends JFrame{
private JTabbedPane jtabbedpane = new JTabbedPane();
private JTextField jtextField = new JTextField();
public JTabbedPaneTest(String title){
super(title);
Container contentPane = this.getContentPane();
//添加六个选项卡
jtabbedpane.addTab("第一页", new JPanel());
jtabbedpane.addTab("第二页", new JPanel());
jtabbedpane.addTab("第三页", new JPanel());
jtabbedpane.addTab("第四页", new JPanel());
jtabbedpane.addTab("第五页", new JPanel());
jtabbedpane.addTab("第六页", new JPanel());
//注册监听器
jtabbedpane.addChangeListener(new MyChangeListener());
contentPane.add(jtextField,BorderLayout.SOUTH);
contentPane.add(jtabbedpane,BorderLayout.CENTER);
this.setSize(300,200);
this.setVisible(true);
}
//命名内部类处理Change事件
private class MyChangeListener implements ChangeListener{
public void stateChanged(ChangeEvent e) {
String temp = jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex());
jtextField.setText(temp+"被选择");
}
}
}
public class Test8_2 {
public static void main(String[] args) {
new JTabbedPaneTest("JTabbedPane测试");
}
}
程序运行结果如图8-3左侧所示。
将创建JTabbedPane类对象的无参构造方法修改为
private JTabbedPane jtabbedpane = new JTabbedPane(JTabbedPane.BOTTOM,JTabbedPane.SCROLL_TAB_LAYOUT);
则程序运行结果如图8-3右侧

图8-3 例8-2运行结果
事件处理中有如下一段代码:
String temp = jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex());
getSelectedIndex()方法表示获得当前选择的选项卡的索引值(int类型,从0开始,-1表示未选中任何选项卡)。
getTitleAt(index)方法表示获得索引值为index的选项卡的标题。
8.1.4 JScrollPane
JSCrollPane又称滚动面板,可以用于当窗口中的内容大于窗口时,在窗口的右边和下边设置滚动条,借助滚动条就可以 看到整个窗口的内容。JSCrollPane的直接父类为JComponent。
JSCrollPane提供了四个构造方法用于创建JSCrollPane类对象,见下表。
表8-2 JSCrollPane构造方法
|
构造方法 |
说明 |
|
JScrollPane() |
创建一个空的JSCrollPane对象 |
|
JScrollPane(Component view) |
创建JSCrollPane对象,并加入一个view组件,当组件内容大于显示区域时自动产生滚动条 |
|
JScrollPane(int vsbPolicy, |
创建有水平滚动条和垂直滚动条的JSCrollPane对象 |
JScrollPane(Component view, int vsbPolicy,int hsbPolicy) |
创建有水平滚动条和垂直滚动条的JSCrollPane对象,并在其内加入一个view对象 |
有关JSCrollPane的例子我们在其他用到JSCrollPane的地方进行介绍,这里不单独举例了。
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15080520号-20 珠峰网 版权所有 All Rights Reserved
|