常用窗体

JFrame窗体

开发 Swing 程序的流程可以被简单地概括为首先通过继承 javax.swing.JFrame 类创建一个窗体,然后向这个窗体中添加组件,最后为添加的组件设置监听事件。下面将详细讲解 JFrame 窗体的使用方法。

JFrame 类的常用构造方法包括以下两种形式。

  • public JFrame():创建一个初始不可见、没有标题的窗体。

  • public JFrame(String title):创建一个不可见、具有标题的窗体。

例如,创建一个不可见、具有标题的窗体,关键代码如下:

JFrame jf = new JFrame("登录系统");
Container container = jf.getContentPane();

在创建窗体后,先调用 getContentPane() 方法将窗体转换为容器,再调用 add() 方法或者 remove() 方法向容器中添加组件或者删除容器中的组件。向容器中添加按钮,关键代码如下:

JButton okBtn = new JButton("确定");
container.add(okBtn);

删除容器中的按钮,关键代码如下:

container.remove(okBtn);

创建窗体后,要对窗体进行设置,如设置窗体的位置、大小、是否可见等。JFrame 类提供的相应方法可实现上述设置操作,具体如下。

  • setBounds(int x, int y, int width, int leight):设置窗体左上角在屏幕中的坐标为(x, y),窗体的宽度为 width,窗体的高度为 height。

  • setLocation(int x, int y):设置窗体左上角在屏幕中的坐标为(x, y)。

  • setSize(int width, int height):设置窗体的宽度为 width,高度为 height。

  • setVisibale(boolean b):设置窗体是否可见。b 为 true 时,表示可见;b 为 false 时,表示不可见。

  • setDefaultCloseOperation(int operation):设置窗体的关闭方式,默认值为 DISPOSE_ON_CLOSE。Java 语言提供了多种窗体的关闭方式,常用的有4种,如表18.2所示。

image 2024 03 05 20 24 40 893
Figure 1. 表18.2 JFrame窗体关闭的几种方式

【例18.1】第一个窗体程序(实例位置:资源包\TM\sl\18\1)

创建 JFreamTest 类,在 JFreamTest 类中创建一个内容为 “这是一个 JFrame 窗体” 的标签后,把这个标签添加到窗体中。

import java.awt.*; //导入AWT包
import javax.swing.*; //导入Swing包

public class JFreamDemo {
	public static void main(String args[]) { // 主方法
		JFrame jf = new JFrame();// 创建窗体对象
		jf.setTitle("创建一个JFrame窗体");// 设置窗体标题
		Container container = jf.getContentPane(); // 获取主容器
		JLabel jl = new JLabel("这是一个JFrame窗体");// 一个文本标签
		jl.setHorizontalAlignment(SwingConstants.CENTER); // 使标签上的文字居中
		container.add(jl); // 将标签添加到主容器中
		jf.setSize(300, 150); // 设置窗体宽高
		jf.setLocation(320, 240);// 设置窗体在屏幕中出现的位置
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 关闭窗体则停止程序
		jf.setVisible(true); // 让窗体展示出来
	}
}

运行结果如图18.2所示。

image 2024 03 05 20 29 25 971

JDialog对话框

JDialog 对话框继承了 java.awt.Dialog 类,其功能是从一个窗体中弹出另一个窗体,如使用 IE 浏览器时弹出的确定对话框。JDialog 对话框与 JFrame 窗体类似,被使用时也需要先调用 getContentPane() 方法把 JDialog 对话框转换为容器,再对 JDialog 对话框进行设置。JDialog 类常用的构造方法如下。

  • public JDialog():创建一个没有标题和父窗体的对话框。

  • public JDialog(Frame f):创建一个没有标题,但指定父窗体的对话框。

  • public JDialog(Frame f, boolean model):创建一个没有标题,但指定父窗体和模式的对话框。如果 model 为 true,那么弹出对话框后,用户无法操作父窗体。

  • public JDialog(Frame f, String title):创建一个指定标题和父窗体的对话框。

  • public JDialog(Frame f, String title, boolean model):创建一个指定标题、父窗体和模式的对话框。

【例18.2】在窗体中弹出对话框(实例位置:资源包\TM\sl\18\2)

创建 MyJDialog 类,使之继承 JDialog 窗体,在父窗体中添加按钮,当用户单击按钮时,弹出对话框。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyJDialog extends JDialog { // 自定义对话框类,继承JDialog
	public MyJDialog(MyFrame frame) {
		// 调用父类构造方法,第一个参数是父窗体,第二个参数是窗体标题,第三个参数表示阻塞父窗体
		super(frame, "第一个JDialog窗体", true);
		Container container = getContentPane(); // 获取主容器
		container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
		setBounds(120, 120, 100, 100); // 设置对话框窗体在桌面显示的坐标和大小
	}
}

public class MyFrame extends JFrame { // 自定义窗体类,继承JFrame
	public MyFrame() {// 窗体的构造方法
		Container container = getContentPane(); // 获得窗体主容器
		container.setLayout(null); // 容器使用绝对布局
		JButton bl = new JButton("弹出对话框"); // 创建一个按钮
		bl.setBounds(10, 10, 100, 21); // 定义按钮在容器中的坐标和大小
		bl.addActionListener(new ActionListener() { // 为按钮添加点击事件
			public void actionPerformed(ActionEvent e) {// 点击事件触发的方法
				MyJDialog dialog = new MyJDialog(MyFrame.this); // 创建MyJDialo对话框
				dialog.setVisible(true); // 使对话框可见
			}
		});
		container.add(bl); // 将按钮添加到容器中
		setSize(200, 200); // 窗体的宽高
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 关闭窗体则停止程序
		setVisible(true); // 使窗体可见
	}

	public static void main(String args[]) {
		new MyFrame();
	}
}

运行结果如图18.3所示。

image 2024 03 05 20 31 55 018
Figure 2. 图18.3 从父窗体中弹出对话框

JOptionPane小型对话框

Java API 中的 javax.swing.JOptionPane 类是一个非常简便的小型对话框类,该类用于创建对话框的方法都是静态方法,无须创建对象即可弹出。在日常开发中经常使用该类弹出提示、确认用户需求、调试程序等。JOptionPane 提供了 4 种创建对话框的方法,如表18.3所示。

image 2024 03 05 20 34 09 168
Figure 3. 表18.3 JOptionPane类提供的4种创建对话框的方法

下面分别介绍这 4 种对话框的外观样式和使用方法。

自定义对话框

首先介绍一个自定义的对话框,这个对话框可以说是一块白板,开发者可以自行定义对话框中显示的元素。创建自定义对话框的方法如下:

public static int showOptionDialog(Component parentComponent,
    Object message,
    String title,
    int optionType,
    int messageType,
    Icon icon,
    Object[] options,
    Object initialValue)

参数说明如下。

  • parentComponent:指明对话框在哪个窗体上显示,如果传入具体的窗体对象,对话框会在该窗体居中位置显示,如果传入null,则在屏幕中间弹出对话框。

  • message:提示的信息。

  • title:对话框的标题。

  • optionType:指定可用于对话框的选项的整数,即 DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION 或 OK_CANCEL_OPTION。

  • messageType:指定消息种类的整数,主要用于确定来自可插入外观的图标,即 ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE 或 PLAIN_MESSAGE。

  • icon:在对话框中显示的图标。options:指示用户可能选择的对象组成的数组。如果对象是组件,则可以正确呈现,非 String 对象使用其 toString 方法呈现;如果此参数为 null,则由外观确定选项。

  • initialValue:表示对话框的默认选择的对象,只有在使用 options 时才有意义,可以为 null。

【例18.3】弹出会话框,问用户准备好了吗(实例位置:资源包\TM\sl\18\3)

在自定义对话框中显示 “你做好准备了吗?”,并添加两个 JButton 按钮,分别为 “是的” 和 “再想想”。

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class Demo {
	public static void main(String[] args) {
		Object o[] = {new JButton("是的"), new JButton("再想想")};   // 按钮对象的Object数组
		Icon icon = new ImageIcon("src/注意.png");                      // 获取图标对象
		JOptionPane.showOptionDialog(null, "你做好准备了吗?", "注意了!",
		                    JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION, icon, o, null);

	}
}

运行效果如图18.4所示。

image 2024 03 05 20 38 52 657
Figure 4. 图18.4 自定义对话框的效果

确认框

确认框已经封装好了一套外观样式,弹出后要求用户做选择操作,用户选择具体选项后,确认框可以返回用户的选择结果,结果以 int 方式返回。创建确认对话框的方法有以下几种重载形式:

  • 调出带有选项 Yes、No 和 Cancel 的对话框,标题为 Select an Option。

    static int showConfirmDialog(Component parentComponent, Object message);
  • 调出一个由 optionType 参数确定其中选项数的对话框。

    static int showConfirmDialog(Component parentComponent, Object message, String title, int optionType)
  • 调用一个由 optionType 参数确定其中选项数的对话框,messageType 参数确定要显示的图标。

    static int showConfirmDialog(Component parentComponent,
        Object message,
        String title,
        int optionType,
        int messageType)
  • 调出一个带有指定图标的对话框,其中的选项数由 optionType 参数确定。

static int showConfirmDialog(Component parentComponent,
    Object message,
    String title,
    int optionType,
    int messageType,
    Icon icon)

【例18.4】弹出确认框,询问用户是否离开(实例位置:资源包\TM\sl\18\4)

弹出一个确认框,询问用户是否离开,提供“是”、“否”、“取消” 3 个按钮。

import javax.swing.JOptionPane;

public class Demo {
	public static void main(String[] args) {
		int answer = JOptionPane.showConfirmDialog(null,
				"确定离开吗?",
				"标题",
				JOptionPane.YES_NO_OPTION);
	}
}

此确认框的弹出效果如图18.5所示。如果用户单击 “是” 按钮,那么变量 answer 获得的值为 0;如果用户单击 “否” 按钮,那么变量 answer 获得的值为 1;如果用户单击 “取消” 按钮,那么变量 answer 获得的值为 2。

如果只想弹出 “是” 和 “否” 两个按钮,可以使用 JOptionPane.YES_NO_OPTION 类型,该类型对话框效果如图18.6所示。

image 2024 03 05 20 53 03 938
Figure 5. 图18.5 3个按钮的确认框
image 2024 03 05 20 53 25 865
Figure 6. 图18.6 两个按钮的确认框

输入框

输入框已经封装好了一套外观样式,弹出后要求用户在文本框中输入文本,用户完成输入操作后,输入框可以返回用户输入的结果。创建输入框的方法有以下几种重载形式:

  • 显示请求用户输入内容的问题消息对话框,它把 parentComponent 作为其父级。

    static String showInputDialog(Component parentComponent, Object message)
  • 显示请求用户输入内容的问题消息对话框,它把 parentComponent 作为其父级。

    static String showInputDialog(Component parentComponent, Object message, Object initialSelectionValue)
  • 显示请求用户输入内容的对话框,它把 parentComponent 作为其父级,该对话框的标题为 title,消息类型为 messageType。

    static String showInputDialog(Component parentComponent, Object message, String title, int messageType)
  • 提示用户在可以指定初始选择、可能选择及其他所有选项的模块化的对话框中输入内容。

    static Object showInputDialog(Component parentComponent,
        Object message,
        String title,
        int messageType,
        Icon icon,
        Object[] selectionValues,
        Object initialSelectionValue)
  • 显示请求用户输入的问题消息对话框。

    static String showInputDialog(Object message)
  • 显示请求用户输入的问题消息对话框,它带有已初始化为 initialSelectionValue 的输入值。

    static String showInputDialog(Object message, Object initialSelectionValue)

【例18.5】弹出会话框,让用户输入自己的姓名(实例位置:资源包\TM\sl\18\5)

弹出一个输入框,让用户输入自己的姓名。

import javax.swing.JOptionPane;

public class Demo {
	public static void main(String[] args) {
		String name = JOptionPane.showInputDialog(null, "请输入您的姓名");
	}
}

此输入框弹出效果如图18.7所示,用户输入姓名后,单击 “确定” 按钮,变量 name 获得的值就是输入框中的文本值。如果用户单击 “取消” 按钮,那么变量 name 获得的值为 null。

image 2024 03 05 21 05 44 293
Figure 7. 图18.7 输入框效果

通知框

通知框是最简单的一个对话框,仅弹出提示,不会返回任何值。创建通知框方法有以下几种重载形式:

  • 调出标题为 Message 的信息消息对话框。

    static void showMessageDialog(Component parentComponent, Object message)
  • 调出对话框,它显示使用由 messageType 参数确定的默认图标的 message。

    static void showMessageDialog(Component parentComponent,
        Object message,
        String title,
        int messageType)
  • 调出一个显示信息的对话框,为其指定了所有参数。

    static void showMessageDialog(Component parentComponent,
        Object message,
        String title,
        int messageType,
        Icon icon)

【例18.6】弹出警告对话框(实例位置:资源包\TM\sl\18\6)

弹出一个警告提示,告知用户已与服务器断开连接。

import javax.swing.JOptionPane;

public class Demo {
	public static void main(String[] args) {
		JOptionPane.showMessageDialog(null, 
				"您与服务器断开了连接", 
				"发生错误", 
				JOptionPane.ERROR_MESSAGE);
	}
}
image 2024 03 05 21 22 21 684
Figure 8. 图18.8 通知框效果

编程训练(答案位置:资源包\TM\sl\18\编程训练)

【训练1】创建指定大小的窗体 在桌面(300,100)坐标位置处创建一个宽320、高240的窗体。

【训练2】创建动态大小的窗体 创建动态大小的窗体,并根据桌面大小调整窗体大小。