第十三章 Swing程序设计

Swing 程序设计

Swing概述

  1. Swing为“轻量级组件“完全由Jav语言编写,可以在任何平台上运行;依赖于本地平台的组件被称为“重量级组件”,如AWT
  2. Swing组件的类的层次和继承关系
Created with Raphaël 2.2.0 Java.lang.Object类 Java.awt.Component类 Java.awt.Container类 Javax.swing.JComponent类
  1. 常用Swing组件概述
组件名称定义
JButton代表Swingt按钮,按钮可以带一些图片或文字
JCheckBoxSwing中的复选框组件
JComBox下拉列表框,可以在下拉显示区域显示多个选项
JFrameSwing的框架类
JDialogSwing版本的对话框
JLabelSwing中的标签组件
JRadioButtonSwing的单选按钮
JList能够在用户界面中显示一系列条目的组件
JTextField文本框
JPasswordField密码框
JTextAreaSwing中的文本区域
JOptionPaneSwing中的一些对话框体

常用窗体

JFrame窗体

 可以将JFrame看作是承载这些Swing组件的容器。
 创建JFrame窗体前需要继承java.swing.JFrame类
  • JFrame在程序中的语法格式如下
JFrame jf = new JFrame(title);
Container container = jf.getContentPane();
  • jf:JFrame类的对象
  • container:Container类的对象,可以使用JFrame对象调用getContentPane()方法获取。

Swing组件的窗体通常与组件和容器相关,所以在JFrame对象创建完成后,需要调用getContentPane()方法将窗体转换为容器,然后在容器中添加组件或设置布局管理器。

  1. 如需将组件添加至容器,可以使用来自Container类的add()方法进行设置,如:
container.add(new JButton("按钮"));
  1. remove()方法将这些组件从容器中删除
container.remove(new JButton("按钮"));

实例:

import java.awt.*;

import javax.swing.*;

public class Example1 extends JFrame {
	private static final long serialVersionUID = 1L;

// 定义一个类继承JFrame类
	public void CreateJFrame(String title) { // 定义一个CreateJFrame()方法
		JFrame jf = new JFrame(title); // 实例化一个JFrame对象
		Container container = jf.getContentPane(); // 获取一个容器
		JLabel jl = new JLabel("这是一个JFrame窗体"); // 创建一个JLabel标签
		// 使标签上的文字居中
		jl.setHorizontalAlignment(SwingConstants.CENTER);
		container.add(jl); // 将标签添加到容器中
		container.setBackground(Color.white);//设置容器的背景颜色
		jf.setVisible(true); // 使窗体可视
		jf.setSize(200, 150); // 设置窗体大小
		// 设置窗体关闭方式
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	
	public static void main(String args[]){//在主方法中调用createJFrame()方法
		new Example1().CreateJFrame("创建一个JFrame窗体");
	}
}

在这里插入图片描述
3.可使用JFrame类的setVisible(true)方法使窗体可见
4. 使用setSize(int x,int y)方法设置窗体大小,x宽y高
5. 给与窗体一个关闭方式,可以调用setDefaultCloseOperation()方法关闭窗体。常用以下4种窗体关闭提供了多种方式:

  • DO_NOTHING_ON_CLOSE //不执行任何操作。
  • DISPOSE_ON_CLOSE //隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
  • HIDE_ON_CLOSE //只隐藏界面,setVisible(false)。
  • EXIT_ON_CLOSE //直接关闭应用程序,System.exit(0)。一个main函数对应一整个程序。

更详细的参照代码解释参照:链接: 窗口关闭setDefaultCloseOperation()的整理

JDialog窗体

  1. JDialog 窗体的功能是从一个窗体中弹出另一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。
  2. JDialog 在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
  3. JDialog类的构造方法
  • public JDialog():创建一个没有标题和父窗体的对话框
  • public JDialog(Frame f) :创建一个指定父窗体的对话框,但该窗体没有标题。
  • public JDialog(Frame f,boolean model): 创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题
  • public JDialog(Frame f,String title):创建一个指定标题和父窗体的对话框。
  • public JDialog(Frame f,String title,boolean model):创建一个指定标题、窗体和模式的对话框。

例:

package com.lzw;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

class MyJDialog extends JDialog { // 创建新类继承JDialog类

	private static final long serialVersionUID = 1L;

	public MyJDialog(MyFrame frame) {
		// 实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
		super(frame, "第一个JDialog窗体", true);
		Container container = getContentPane(); // 创建一个容器
		container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
		setBounds(120, 120, 100, 100); // 设置对话框窗体大小
	}
}

public class MyFrame extends JFrame { // 创建新类

	private static final long serialVersionUID = 1L;

	public static void main(String args[]) {
		new MyFrame(); // 实例化MyJDialog类对象
	}

	public MyFrame() {
		Container container = getContentPane(); // 创建一个容器
		container.setLayout(null);
		JLabel jl = new JLabel("这是一个JFrame窗体"); // 在窗体中设置标签
		// 将标签的文字置于标签中间位置
		jl.setHorizontalAlignment(SwingConstants.CENTER);
		container.add(jl);
		JButton bl = new JButton("弹出对话框"); // 定义一个按钮
		bl.setBounds(10, 10, 100, 21);
		bl.addActionListener(new ActionListener() { // 为按钮添加鼠标单击事件
			public void actionPerformed(ActionEvent e) {
				// 使MyJDialog窗体可见
				new MyJDialog(MyFrame.this).setVisible(true);
			}
		});
		container.add(bl); // 将按钮添加到容器中

		container.add(bl);
		container.setBackground(Color.white);
		setSize(200, 200);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setVisible(true);
	}
}

在这里插入图片描述

标签组件与图标

标签的使用

标签由JLabel类定义,它的父类为JComponent类
  1. 标签可以显示一行制度文本、一个图像或带图像的文本,它并产生任何类型的事件

图标的使用

Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。

图标可以用Java支持图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建

创建图标

在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。如果使用Icon接口,必须实现Icon接口中改的3个方法:

  • public int getIconHeight();
  • public int getIconWidth();
  • public void painIcon(Component arg(),Graphics arg1,int arg2,int arg3)
    其中 painICon()方法用于实现在指定坐标位置画图。
使用图片图标

Swing利用javax.swing.ImageIcon类根据现有图片创建图标,ImageIcon类实现了Icon接口,同时Java支持多种图片格式。

	java.lang.Class类中的getResource()方法可以获取资源文件的URL路径。

常用布局管理

Swing提供的常用布局管理器包括流布局管理器边界布局管理器网格布局管理器

绝对布局

使用绝对布局的步骤如下:
(1)使用Container.setLayout(null)方法取消布局管理器。
(2)使用Component.setBounds(int x,int y,int width,int height)方法设置每个组件的大小与位置。

流布局管理器

  默认情况,组件在每一行都是居中排列的

常用构造方法:

  1. public FlowLayout()
  2. public FlowLayout(int alignment)
  3. public FlowLayout(int alignment,int horizGap,int vertGap)

alignment参数表示使用流布局管理器后组件每一行的具体摆放位置。

  • FlowLayout.LEFT = 0
  • FlowLayout.CENTER = 1
  • FlowLayout.RIGHT=2

horizGap和vertGap两个参数分别以像素为单位指定组件之间的水平间隔与垂直间隔。

边界布局管理器

 默认不指定窗体布局的情况下,Swing组件的布局模式是边界(BorderLayout)布局管理器

通过调用Container的add(BorderLayout成员变量,组件)方法设置
BorderLayout主要成员变量://一看就懂,自行理解

  1. BorderLayout.NORTH
  2. BorderLayout.SOUTH
  3. BorderLayout.EAST
  4. BorderLayout.WEST
  5. BorderLayout.CENTER

网格布局管理器

网格布局管理器每一个组件大小相同。从左到右、从上到下
常用构造方法:

  • public GridLayout(int rows,int columns)
  • public GridLayout(int rows,int columns,int horizGap,int vertGap)

常用面板

面板也是一种容器,因为它也继承自java.awt.Container类。

JPanel面板

JPanel面板可以聚集一些组件来布局。

例题中给出一个程序,在窗体中使用4个面板,然后在每个面板中设置布局管理器,最后分别在4个面板中放置一些组件

import java.awt.*;
import javax.swing.*;
public class JPanelTest extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public JPanelTest() {
		Container c = getContentPane();
		// 将整个容器设置为2行1列的网格布局
		c.setLayout(new GridLayout(2, 1, 10, 10));
		// 初始化一个面板,设置1行3列的网格布局
		JPanel p1 = new JPanel(new GridLayout(1, 3, 10, 10));
		JPanel p2 = new JPanel(new GridLayout(1, 2, 10, 10));
		JPanel p3 = new JPanel(new GridLayout(1, 2, 10, 10));
		JPanel p4 = new JPanel(new GridLayout(2, 1, 10, 10));
		p1.add(new JButton("1")); // 在面板中添加按钮
		p1.add(new JButton("1"));
		p1.add(new JButton("2"));
		p1.add(new JButton("3"));
		p2.add(new JButton("4"));
		p2.add(new JButton("5"));
		p3.add(new JButton("6"));
		p3.add(new JButton("7"));
		p4.add(new JButton("8"));
		p4.add(new JButton("9"));
		c.add(p1); // 在容器中添加面板
		c.add(p2);
		c.add(p3);
		c.add(p4);
		setTitle("在这个窗体中使用了面板");
		setSize(420, 200);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new JPanelTest();
	}
}

JScrollPane面板

  1. JScrollPane面板是带滚动条的面板。
  2. JScrollPane只能放置一个组件,并且不可以使用布局管理器
  3. 如果需要在JScrollPane面板中方式多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane组件上

按钮组件

Swing中提供多种按钮,包括提交按钮、复选框、单选按钮等,这些按钮都是从**AbstractButton**类中继承而来的

提交按钮组件

提交按钮JButton,其父类为AbstractButton类。具体方法查看API。

单选按钮组件

  1. 单选按钮JRadionButton
  2. 在应用程序中,一般将多个单选按钮放置在按钮组中,使这些单选按钮表现出某种功能,当用户选中某个单选按钮后,按钮组中其他按钮将被自动取消。
按钮组

在Swing中存在一个ButtonGroup类,用于产生按钮组,如果希望将所有的单选按钮放置在按钮组中,需要实例化一个JRadioButton对象,并使用该对象调用add()方法添加单选按钮。

复选框组件

复选框(JCheckBox)具有一个方块图标,外加一段描述性蚊子,可以进行多选设置。

列表组件

Swing中提供两种列表组件,分别为下拉列表框与列表框

下拉列表框组件

JComboBox类

JComboBox类是JComponent类的子类,常用构造方法:

  • public JComboBox()
  • public JComboBox(ComboBoxModel dataModel)
  • public JComboBox(Object[] arrayData)
  • public JComboBox(Vector vector)
    其中参数为下拉列表框中的内容
JComboBox模型

ComboBoxModel为接口,它代表一般模型,可以自定义一个类实现该接口,然后在初始化JComboBox对象时向上转型为ComboBoxModel接口类型,但必须实现以下两种方法:

  • public void setSelectedItem(Object item)
  • public Object getSelectedItem()
    自定义这个类除了实现该接口之外,还可以继承AbstractListModel类,该类中也有两个操作下拉列表框的重要方法:
  • getSize():返回列表的长度
  • getElementAt(int index):返回指定索引处的值
    上例子:
import java.awt.*;
import javax.swing.*;
public class JComboBoxModelTest extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	JComboBox<String> jc = new JComboBox<>(new MyComboBox());
	JLabel jl = new JLabel("请选择证件:");
	
	public JComboBoxModelTest() {
		setSize(new Dimension(160, 180));
		setVisible(true);
		setTitle("在窗口中设置下拉列表框");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout());
		cp.add(jl);
		cp.add(jc);
	}
	
	public static void main(String[] args) {
		new JComboBoxModelTest();
	}
}

class MyComboBox extends AbstractListModel<String> implements ComboBoxModel<String> {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	String selecteditem = null;
	String[] test = { "身份证", "军人证", "学生证", "工作证" };
	
	public String getElementAt(int index) {
		return test[index];
	}
	
	public int getSize() {
		return test.length;
	}
	
	public void setSelectedItem(Object item) {
		selecteditem = (String) item;
	}
	
	public Object getSelectedItem() {
		return selecteditem;
	}
	
	public int getIndex() {
		for (int i = 0; i < test.length; i++) {
			if (test[i].equals(getSelectedItem()))
				return i;
		}
		return 0;
	}
}

在这里插入图片描述

列表框组件

列表框(JList)【跳】

文本组件

文本框组件

文本框(JTExtField)用来显示或编辑一个单行文本。

密码框组件

密码框(JPasswordField)将用户输入的字符串以某种符号进行加密。
在JPasswordField类中提供一个setEchoChar()方法,可以改变密码框的回显字符。

文本域组件

文本域(JTextArea)在程序中接受用户的多行文字输入。

常用事件监听器

监听事件简介

在Swing事件模型中由3个分离的对象完成对事件的处理,分别为事件源、事件以及监听程序。事件源触发一个事件,它被一个或多个“监听器”接收,监听器负责处理事件。

动作事件监听器

动作事件(ActionEvent)监听器。

事件名称事件源监听接口添加或删除相应类型监听器的方法
ActionEventJbutton、JList、JTextFieldActionListeneraddActionListener()、removeActionListener()
一般情况下,为事件源做监听事件应使用匿名内部类形式。

焦点事件监听器

焦点事件(FocusEvent)

事件名称事件源监听接口添加或删除相应类型监听器的方法
FocusEventComponent以及派生类FocusListeneraddFocusListener()、removeFocusListener()

在监听需要实现FocusListener接口,在该接口中定义了两个方法,分别为focusLost()与 focusGained()方法。

实践与练习

时间问题,这里先欠下,本人学习重点也不在前端gui部分

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值