第10章 创建Swing界面
- 10.1 Swing的特性
- 10.1.1 标准对话框
- 1. 确认对话框
- 2. 输入对话框
- 3.消息对话框
- 4. 选项对话框
- 10.1.2 使用对话框
- 10.1.3 滑块
- 10.1.4 滚动窗格
- 10.1.5 工具栏
- 10.1.6 进度条
- 10.1.7 菜单
- 10.1.8 选项卡式窗格
10.1 Swing的特性
10.1.1 标准对话框
JOptionPane类提供了几个可用于创建标准对话框的方法。标准对话框是一个小窗口,用于询问问题、向用户发出警告或提供重要消息。下面是JOptionPane提供的4个标准对话框类:
- ConfirmDialog:
询问问题,包含用于进行Yes、No和Cancle等响应的按钮 - InputDialog:
提示用户输入文本 - MessageDialog:
显示消息 - OptionDialog:
包含上面三种对话框
1. 确认对话框
调用showConfirmDialog(Component,Object)
- component参数指出了包含对话框的容器,确定对话框窗口应显示在屏幕的什么位置。如果为null或指定的容器不是JFrame对象,对话框将显示在屏幕中央
- object可以是字符串、组件或Icon对象。如果是一个字符串,其中的文本将显示在对话框里;如果是一个组件或Icon,则将显示该对象。
该方法返回下列5个可能的整数值之一:
YES_OPTION, NO_OPTION, CANCEL_OPTION,OK_OPTION和CLOSED_OPTION
eg:
showConfirmDialog(Component,Object,string,int,int)
//后三个参数:
//string: 将显示在对话框标题栏中的字符串
//int :指出将显示哪些选项按钮,应为类常量 YES_NO_CANCEL_OPTION或YES_NO_OPTION;
// int:一个描述对话框类型的整数,值为类变量ERROR_MESSAGE、INFORMATION_MESSAGE、PLAIN_MESSAGE、QUESTION_MESSAGE或WARNING_MESSAGE
int response=JOptionPane.showConfirmDialog(null,
"Error reading file. Want to try again?",
"FIle Input Error",
JOptionPane.YES_NO_OPTION,
JOptionPane.ERROR_MESSAGE);
2. 输入对话框
输入对话框询问一个问题,并使用文本框来存储用户的响应。要调用输入对话框,最简单的方式是调用方法showInputDialog(Component,Object).
showInputDialog(Component,Object,String,int)
// 方法倒数两个参数与上述确认对话框方法第三个和第五个参数相同
String response =JOptionPane.showInputDialog(null,
"What is your ZIP code?",
"Enter ZIP Code",
JOptionPane.QUESTION_MESSAGE);
3.消息对话框
消息对话框是一个显示信息的简单窗口,可使用showMessageDialog(Component,Object)来创建。也可以使用方法showMessageDialog(Component,Object,String,int)来创建消息对话框,只是不返回任何值。
JOptionPane.showMessageDialog(null,
"An asteroid has destroyed the earth.",
"Asteroid Destruction Alert",
JOptionPane.WARING_MESSAGE);
4. 选项对话框
选择对话框,它融其他所有对话框的特性于一体。这种对话框可使用方法showOptionDialog(Component,Object,String,int,int,Icon,Object[],Object)来创建。
- 对话框的父组件;
- 要显示的文本、图标或组件
- 要在标题栏中显示的字符串
- 对话框类型,值为类常量YES_NO_OPTION或YES_NO_CANCLE_OPTION,如果要使用其他按钮,则为字面量0
- 要显示的图标,值为类常量ERROR_MESSAGE、INFORMATION_MESSAGE、PLAIN_MESSAGE
- 要显示的Icon对象,它将替换前一个参数指定的图标
- 一个对象组,其中存储了表示对话框中选项的组件和其他对象
- 没有使用YES_NO_OPTION或YES_NO_CANCEL_OPTION时,表示默认选项的对象
String[] gender={
"Male",
"Female",
"None of Your Business"
};
int response = JOptionPane.showOptionDialog(null,
"What is your gender?",
"Gender",
0,
JOptionPane.INFORMATION_MESSAGE,
null,
gender,
gender[2]);
System.out.println("You chose "+gender[response]);
10.1.2 使用对话框
import java.awt.GridLayout;
import javax.swing.*;
public class FeedInfo extends JFrame{
private JLabel nameLabel = new JLabel("Name: ",SwingConstants.RIGHT);
private JTextField name;
private JLabel urlLabel = new JLabel("URL: ",SwingConstants.RIGHT);
private JTextField url;
private JLabel typeLabel = new JLabel("Type: ",SwingConstants.RIGHT);
private JTextField type;
public FeedInfo(){
super("Feed Information");
setSize(400,145);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLookAndFeel();
// Site name
String response1=JOptionPane.showInputDialog(null,"Enter the site name:");
name = new JTextField(response1,20);
// site address
String response2 = JOptionPane.showInputDialog(null,"Enter the size address:");
url = new JTextField(response2,20);
// site type
String[] choices = {"Personal","Commercial","Unknown"};
int response3 = JOptionPane.showOptionDialog(null,
"What type of site is it?",
"Site Type",
0,
JOptionPane.QUESTION_MESSAGE,
null,
choices,
choices[0]);
type = new JTextField(choices[response3],20);
setLayout(new GridLayout(3,2));
add(nameLabel);
add(name);
add(urlLabel);
add(url);
add(typeLabel);
add(type);
setLookAndFeel();
setVisible(true);
}
private void setLookAndFeel(){
try{
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}catch (Exception exc){
System.err.println("Couldn't use the system "+"look and feel: "+exc);
}
}
public static void main(String[] args) {
FeedInfo frame=new FeedInfo();
}
}
10.1.3 滑块
在Swing中,滑块是使用类JSlider来实现的,它让用户能够通过滑动控制来设置一个位于最大值和最小值之间的值。很多时候都可以使用滑块来获取数字输入,其优点是能够限制可输入的值。
默认情况下,滑块是水平方向的,但可以使用接口SwingConstants的两个类常量(HORIZONTSL和VERTICAL)来显示地设置其方向。
- JSlider(int):一个指定方向的滑块,最小值、最大值和初始值分别为0、100和50
- JSlider(int,int):一个指定最小值和最大值的滑块。
- JSlider(int,int, int):一个具有指定的最小和最大值以及初始值的滑块。
- JSlider(int,int, int, int):一个具有指定的方向。最小值、最大值和初始值的滑块。
下面是几个JSlider的方法:
- setMajorTickSpacing(int): 按指定的间隔放置主刻度线
- setMinorTickSpacing(int):按指定的间隔放置次刻度线
- setPaintTicks(boolean):决定是否显示刻度线
- setPaintLabels(boolean):决定是否显示数字标签
import javax.swing.*;
public class Slider extends JFrame{
public Slider(){
super("Slider");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLookAndFeel();
JSlider pick=new JSlider(JSlider.HORIZONTAL,0,30,5);
pick.setMajorTickSpacing(10);
pick.setMinorTickSpacing(1);
pick.setPaintTicks(true);
pick.setPaintLabels(true);
add(pick);
pack();
setVisible(true);
}
private void setLookAndFeel(){
try{
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception exc){
System.err.println("Counldn't use the system "+"look and feel: "+exc );
}
}
public static void main(String[] args) {
Slider frame=new Slider();
}
}
10.1.4 滚动窗格
可以使用构造函数ScrollPane(Object)来创建滚动窗格,其中Object表示能被滚动的组件。
JTextArea textBox = new JTextArea(7,30);
JScrollPane scroller = new JScrollPane(textBox);
mainPane.add(Scroller);
- HORIZONTAL_SCROLLBAR_ALWAYS
- HORIZONTAL_SCROLLBAR_AS_NEEDED
- HORIZONTAL_SCROLLBAR_NEVER
- VERTICAL_SCROLLBAR_ALWAYS
- VERTICAL_SCROLLBAR_AS_NEEDED
- VERTICAL_SCROLLBAR_NEVER
这些常用于构造函数ScrollPane(object,int,int)中,
JScrollPane scroller =new JScrollPane(textBox,
VERTICAL_SCROLLBAR_ALWAYS,
HORIZONTAL_SCROLLBAR_NEVER);
10.1.5 工具栏
在Swing中,使用JToolBar类来创建工具栏,后者是一个容器,它将多个组件组织为一行或一列。被组织的通常是按钮。
很多时候工具栏是水平的,但可以使用接口SwingConstants的类常量HORIZONTAL或VERTICAL来显示地设置其方向。
构造函数包括:
- JToolBar()
- JToolBar(int),指定方向
Swing的工具栏也可停放到新窗口内,从而与原来的窗口分离。为了获得最佳结果,应使用布局管理器类BorderLayout将可停放的JToolBar组件放置到容器中。边界布局将容器分为5个区域:北、南、东、西、中,其中每个有方向的组件都占据了它所需的空间,剩下的分配给中央区域。
10.1.6 进度条
在Swing中,进度条是使用类JProgressBar实现的。
构造函数包括
- JProgressBar() ,创建一个新的进度条
- JProgressBar(int, int),创建一个有指定的最小值和最大值的进度条
- JProgressBar(int, int, int),创建一个有指定的方向、最小值和最大值的进度条
可以使用接口SwingConstants的类常量HORIZONTAL或VERTICAL来显示地设置其方向。
setMinimum(int)
setMaximum(int)
// 设置最小值和最大值。
setValue(int)
// 指定一个当前进度的值传递给它
setStringPainted(boolean)
// 设置标签显示已完成的任务比例,若为false不显示该标签
10.1.7 菜单
在java中,3种组件协同工作来支持菜单
- JMenuItem: 菜单中的一个菜单项
- JMenu: 一个下拉菜单,包含一个或多个JMenuItem组件、其他界面组件和分隔条
- JMenuBar:包含一个或多个JMenu组件并显示其名称的容器
JMenuItem(String)
JMenuItem(Icon)
JMenuItem(String,Icon)
// 构造函数
addSeparator()
// 将分隔条加入到菜单末尾
setJMenuBar(JMenuBar)
// 调用框架的setJMenuBar(JMenuBar)方法
10.1.8 选项卡式窗格
选项卡式窗格是一组堆叠在一起的面板,用户每次只能查看其中的一个,在Swing中,这是由JTabbedPane类实现的
- JTabbedPane(),创建一个选项卡式窗格,但不能滚动
- JTabbedPane(int),创建一个选项卡式窗格,有指定的布局
- JTabbedPane(int, int),创建一个有指定布局和滚动策略的选项卡式窗格
选项卡的布局参数有:JTabblePane.TOP、JTabblePane.BOTTOM、JTabblePane.LEFT或JTabbedPane.RIGHT
使用JTabbedPane.WRAP_TAB_LAYOUT来设置不滚动的选项卡式窗格,
使用JTabbedPane.SCROLL_TAB_LAYOUT来设置标签旁显示滚动箭头
创建选项卡式窗格后,调用addTab(String,Componet)方法来加入组件。其中String是标签显示的文本,而第二个参数是一个组件,它是窗格的选项卡之一,通常这是一个JPanel对象,但并非必须如此。