Swing用于开发桌面窗体程序,是JDK的第二代GUI框架,其功能比JDK第一代GUI框架AWT更为强大、性能更加优良。但因为Swing技术推出时间太早,其性能、开发效率等不及一些其他流行技术,所以目前市场上大多数桌面窗体程序都不是由Java开发的,Swing技术也逐渐被广大开发人员放弃了。
不过,Swing是JDK自带的功能,并且能非常好地体现Java语言在面向对象、接口事件等方面的设计模式,又能提供直观地呈现运行效果,所以本书还是纳入此内容。本章不会深入地讲解Swing技术,仅会介绍一些常用组件的使用方法,读者了解即可。
Swing中的大多数组件均为轻量级组件,使用Swing开发出的窗体风格会与当前平台(如Windows、Linux等)的窗体风格保持一致。本章主要介绍Swing中的基本要素,包括窗体的布局、容器、常用组件、如何创建表格等内容。
本章的知识架构及重难点如下。
18.1 Swing概述
Swing主要用来开发GUI(Graphical User Interface)程序,GUI是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮等图形界面元素,我们经常使用的QQ软件、360安全卫士等均为GUI程序。Java语言为Swing程序的开发提供了丰富的类库,这些类分别被存储在java.awt和javax.swing包中。Swing提供了丰富的组件,在开发Swing程序时,这些组件被广泛地应用。
Swing组件是完全由Java语言编写的组件。因为Java语言不依赖于本地平台(即“操作系统”),所以Swing组件可以被应用于任何平台。基于“跨平台”这一特性,Swing组件被称作“轻量级组件”;反之,依赖于本地平台的组件被称作“重量级组件”,
在Swing包的层次结构和继承关系中,比较重要的类是Component类(组件类)、Container类(容器类)和JComponent类(Swing组件父类)。Swing包的层次结构和继承关系如图18.1所示。
18.2常用窗体
创建一个不可的,具有标题的窗体如下:
JFrame jf =new JFrame("登入系统");
Container container = jf.getContenPane();
在创建窗体后,先调用getContentPane()方法将窗体转换为容器,再使用add()方法或者remove()方法想容器中添加组件或者删除容器中的组件,向容器中添加按钮 代码如下:
JButton okBtn = new JButton("确定");
container.add(okBth);//添加按钮
container.remove(okBth);//删除容器中的按钮
创建窗体后,要对窗体惊醒设置 设置大小 位置,是否可见等等
setBounds(int x,int y,int width,int leight)
//设置窗体左上角在屏幕中的坐标(x,y),窗体的宽度为widttth,窗体的高度为height。
setLocation(int x,int y);//设置窗体左上角在屏幕中的坐标为(x,y)
setSize(int width,int heigth);设置窗体的宽度为width,高度为height
setVisibale(boolean b);//设置窗体是否可见。b为true时窗体为可见;b为false时窗体为不可见
setDefaultCloseOperation(int operation);
//设置窗体的关闭方式,默认值为DISPOSE_ON_CLOSE Java语言提供了多种窗体的关闭方式,
创建一个JFreamTest类 在JFreamTest类中创建一个内容为“这是JFrame窗体”后把这个白哦前添加到窗体中 代码如下:
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class jFreamTest {
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.2JDialog对话框
JDialong对话框继承了java.awt.Dialog类,其功能是从一个窗体弹出另一个窗体,如使用IE浏览器时弹出的确定对话框JDialog对话框与JFrame窗体类似,被使用也需要先调用getContentPane()方法Jdialog对话捐给转换为容器再对JDialog对话框进行设置
public JDialong();创建一个没有标题和父窗体的对话框
public JDialong(Frame f);//创建一个没有标题的,但有父窗体的对话框
public JDialong(Frame f ,boolean model);//创建一个没有标题但指定
父窗体和模式的对话框 如果model为true,那么弹出对话框后,用户无法操作父窗体
public JDialong(Frame f ,String title);
//创建一个指定标题和父窗体的对话框
public JDialong(Frame f ,boolean model);//创建一个指定标题 父窗体和模式的对话框
例题在弹窗中弹出对话框:
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.2.3JOptionPane小型对话框
一个非常便捷的小型对话框,该类用于创建对话框的方法都是静态方法,无需创建对象即可弹出,在日常开发中经常使用该类唐初提示确认用户需求
自定义对话框:
public static int showOptionDialog( Component parentComponent
Oject message;
String title;
int optionType;
int messageType;
lcon icon;
Object[] options;
Object initialValue)
}
参数如下:
parentComponent:知名对话框在哪个窗体上显示,如果传入就提的窗体对象和,
对话框会在该窗体居中位置先是 如果传入的是null则会在屏幕中间弹出对话框
message:提示信息
title:对话框的标题
optionType:指定可用对话框的选项的整数
messageType:指定消息种类的整数,主要确定来字可插入外观的图标
options:只是用户可能选择的对象组成的数组。如果对象是组件,则可以正确的呈现,非String对象使用toString方法呈现,如果此参数为null,则由外观确定选项
initiaIValueL表示对话框默认的对象只用options时才有意义,可以为null
以下有四种对话框的例题 代码如下:
弹出会话框
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);
}
}
代码图以及运行结果图:
确认框:
import javax.swing.JOptionPane;
public class Demo1 {
public static void main(String[] args) {
int answer=JOptionPane.showConfirmDialog
(null, "确定离开吗?","标题",JOptionPane.YES_NO_OPTION);
//18.4
}
}
代码图以及运行结果图:
输入框:
import javax.swing.JOptionPane;
public class Demo3 {
public static void main(String[] args) {
String name=JOptionPane.showInputDialog(null,"请输入您的姓名");
}
}
警告对话框:
import javax.swing.JOptionPane;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
JOptionPane.showConfirmDialog(null,
"您与服务器断开了链接",
"发生错误",
JOptionPane.ERROR_MESSAGE);
}
}
18.3.1null绝对布局
绝对布局也叫做null布局,其特点是影星质地的那个组件在容器中的位置和大小,组件的位置是通过绝对坐标的方式来制定的,使用绝对布局首先要Container.setLayout(null)方法取消容器中的布局管理器,然后再用Componnent,setBounds(int x,int y ,int width ,int height)方法来设置每个组件在容器中的位置和大小,如以下例题所示:
使用绝对布局定位按钮位置和大小:
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class AbsoulutePosition extends JFrame{
public AbsoulutePosition() {
setTitle("本窗体使用绝对布局");//窗体标签
setLayout(null);//使用null布局 绝对布局
setBounds(0,0,300,150);//设置窗体的坐标与宽高
Container c =getContentPane();//获取主容器
JButton b1 =new JButton("按钮1");//创建按钮1
JButton b2 =new JButton("按钮2");//创建按钮2
b1.setBounds(10,30,80,30);//这是按钮1的位置和大小
b2.setBounds(60,70,100,20);//设置按钮2 的位置和大小
c.add(b1);//向容器内添加按钮1
c.add(b2);//向容器内添加按钮2
setVisible(true);//使窗体可见
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序
}
public static void main(String[]args) {
new AbsoulutePosition();
}
}
代码图以及运行结果图:
18.3.2FlowLayout流布局管理器-
流布局(FlowLayout)管理器是Swing种最基本的布局管理器。使用流布局管理器拜访组件,组件时被从左到右拜访。当组件占据了当前的所有弓箭是 ,溢出的组件会被移动到当前行的下一行,默认情况下,行组建的排列方式被指定为剧中对其,但是通过设置可以更改没有行组建的排序方式
FlowLayout类具有以下常用的构造方法:
public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment,interestinghorizGap,int vertGap)
构造方法种alignment参数表示使用流布局管理器是每一行组建的排列方式,
该参数可以被赋予FlowLayout.LEFT,flowLayout.CENTER或Flow Layout。RIGHT
在public FlowLayout(int alignnment,int horizGap,int vertGap)还存在horizGap和vertGap两个参数,这两个参数分别以像素为单位指定组件与组件之间的水平间隔和垂直间隔
例题如下:
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class FlowLayoutPosition extends JFrame{
public FlowLayoutPosition() {
setTitle("本窗体使用流布局管理器");//设置窗体标签
Container c =getContentPane();
//窗体使用流布局 组件右对齐,组件之间的水平间隔为10像素,垂直间隔为10像素
setLayout(new FlowLayout(FlowLayout.RIGHT,10,10));
for(int i=0;i<10;i++) {//在容器中循环添加10按钮
c.add(new JButton("button"+i));
}
setSize(300,200);//设置窗体大小
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序
setVisible(true);//使窗体可见
}
public static void main(String[] args) {
new FlowLayoutPosition();
}
}
18.3.3BorderLayout边界布局管理器
使用Swing创建窗体后,容器默认的布局管理器是边界布局(BorderLayout)管理器,边界布局管理把容器规划为东西南北中五个区域使用方法如下
代码如下:
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class BorderLayoutPosition extends JFrame {
public BorderLayoutPosition() {
setTitle("这个窗体使用边界布局管理器");//获取主容器
Container c = getContentPane();//容器使用边界布局
setLayout(new BorderLayout());
JButton centerBtn = new JButton("中");
JButton northBth = new JButton("北");
JButton southBut = new JButton("南");
JButton westBtn = new JButton("西");
JButton eastBth = new JButton("东");
c.add(centerBtn,BorderLayout.CENTER);//中部添加按钮
c.add(northBth,BorderLayout.NORTH);//北部添加按钮
c.add(southBut,BorderLayout.SOUTH);//南部添加按钮
c.add(westBtn,BorderLayout.WEST);//西部添加按钮
c.add(eastBth,BorderLayout.EAST);//东部添加按钮
setSize(350,200);//设置窗体大小
setVisible(true);//设置可见
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//关闭窗体则定制程序
}
public static void main(String[] args) {
new BorderLayoutPosition();
}
}
18.3.4GridLayout网络布局管理器
网络布局管理器(GridLayout)管理器能够把容器划分为网格,组件课按行列进行决定,在网格的大小都相同,例如 一个两行两列的网格布局管理器能够产生4个大小相同的网格,组件从网格的左上角开始按照从左到右,从上到下的顺序来添加到网格中,且每个组件都会被填满整个网格,改变窗体大小时,组件大小也会随之改变 使用方法如下:
代码如下:
import java.awt.*;
import javax.swing.*;
public class GridLayoutPositon extends JFrame{
public GridLayoutPositon() {
Container c=getContentPane();
setLayout(new GridLayout(7,3,5,5));
//设置容器使用网格布局管理器,设置7行3列的网格,组件件水平间距为5像素,垂直间距为5像素
for(int i=0;i<20;i++) {//循环添加按钮
c.add(new JButton("button"+i));
}
setTitle("这是一个使用网格布局管理器的窗体");
setSize(300,300);//窗体大小
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序
setVisible(true);//设为可见
}
public static void main(String[] args) {
new GridLayoutPositon();
}
}
18.4常用面板
在Swing程序设计中 面板是一个容器,被用于容纳其他组件但是面板必须添加到其他容器中Swing中常用的面板包括了JPanel面板和JScrollPane面板
18.4.1JPanel面板
JPanel面板继承了java.awt.Container类JPanel面板必须在窗体容器中使用,无法脱离窗体显示
如下例题所示:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class JPanelTest extends JFrame{
public JPanelTest() {
Container c =getContentPane();
//将整个容器设置为2行2列的网格布局,组件水平间距隔10像素,垂直间距为10px;
c.setLayout(new GridLayout(2,2,10,10));
//初始化一个面板,此面板使用1行4列的网格布局组件水平间隔10px 垂直间隔为10px
JPanel p1 =new JPanel (new GridLayout(1,4,10,10));
//初始化一个面板 此面板使用边界布局
JPanel p2 =new JPanel (new BorderLayout());
//初始化一个面板,此面板使用1行2列的网格布局组件水平间隔10px 垂直间隔为10px
JPanel p3 =new JPanel (new GridLayout(1,2,10,10));
//初始化一个面板,此面板使用2行1列的网格布局组件水平间隔10px 垂直间隔为10px
JPanel p4 =new JPanel (new GridLayout(2,1,10,10));
//给每个面板都添加边框和标题,使用BorderFactory工厂类生成带标题边框的对象
p1.setBorder(BorderFactory.createTitledBorder("面板1"));
p2.setBorder(BorderFactory.createTitledBorder("面板2"));
p3.setBorder(BorderFactory.createTitledBorder("面板3"));
p4.setBorder(BorderFactory.createTitledBorder("面板4"));
//向面板1中添加按钮
p1.add(new JButton("b1"));
p2.add(new JButton("b1"));
p3.add(new JButton("b1"));
p4.add(new JButton("b1"));
//向面板2中添加按钮
p2.add(new JButton("b2"),BorderLayout.WEST);
p2.add(new JButton("b2"),BorderLayout.EAST);
p2.add(new JButton("b2"),BorderLayout.NORTH);
p2.add(new JButton("b2"),BorderLayout.SOUTH);
p2.add(new JButton("b2"),BorderLayout.CENTER);
//向面板3中添加按钮
p3.add(new JButton("b3"));
p3.add(new JButton("b3"));
//向面板4中添加按钮
p4.add(new JButton("b4"));
p4.add(new JButton("b4"));
//向容器中添加面板
c.add(p1);
c.add(p2);
c.add(p3);
c.add(p4);
setTitle("在这个窗体中使用面板");
setSize(500,300);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序
}
public static void main(String[] args) {
JPanelTest test = new JPanelTest();
test.setVisible(true);
}
}
18.4.2JScrollPane滚动面板
JScrollPane面板时带动滚动条的面板,是被用于在较小的窗体中先是较大的篇幅内容,需要注意JScrollPane滚动面板不能使用布局管理器,且只能容纳一个组件。如果需要向JScrollPane面板中添加多个组件,那么需要先将多个逐渐添加到JPanel面板,在将JPanel面板添加到滚动面板 实际使用如下:
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
public class JScrollPaneTest extends JFrame {
public JScrollPaneTest(){
Container c =getContentPane();//获取主容器
//创建一个文本域组件 文本域默认大小为20行50列
JTextArea ta = new JTextArea(20,50);
//创建一个JScrollPane滚动面板,并将文本域放到滚动面板中
JScrollPane sp = new JScrollPane(ta);
c.add(sp);//将该面板添加到竹筒其中
setTitle("带有滚动条的文字编辑器");
setSize(400,200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序
}
public static void main(String[] args) {
JScrollPaneTest test =new JScrollPaneTest();
test.setVisible(true);
}
}
18.5文字标签组件与图标
在Swing程序设计中,标签(JLabel)被用于先是文本,图标等内容,在Swing应用程序中用户界面中,用户能通过标签上的文本,图标等内容获得相应的提示信息
18.5.1JLabel标签
baioqain (JLabel)的弗雷什JCompont类,虽然标签不能被添加监听器,但是标签显示的文本图标内容可以被知道那个对齐方式
通过JLabel类的构造方法们可以创建多种标签,如显示只有文本的标签,只有图标的标签以及同时包含文本和图标的标签等 使用方法如下:
public JLabel();//创建一个不带图标和文本的标签
public JLabel(Icon icon);//创建一个带图标的标签
public JLabel(Icon icon ,int aligment);创建以恶给带图标的标签,并设置图标的水平对齐方式
public JLabel(String text,int aligment);//创建一个带文本标签,并设置文本的水平对齐方式
public JLabel(Icon icon ,String text, int aligment);
//创建一个带文本和图标的JLabel对于宣布发,并设置文本和图标的水平对齐方式
具体使用方法如下代码所示:
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class jFreamTest {
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.5.2图标的使用
在Swing程序设计中,图标经常被添加到标签,按钮组件,使用javax.Swing.ImageIcon类可以根据现有的图片创建图片,UmageIcon类实现了Icon接口,他有多个构造方法 构造方法使用如下:
18.6按钮组件
在Swing程序设计中蛮牛是较见的组件,被用于出发特定的动作 ,Swing提供了多种按钮组件,按钮,单选按钮, 复选框等,
18.6.1JButton按钮
Swing按钮由JButton对象标识JButton常用的构造方法如下:
public JBtton();//创建一个不带文本或者图标的按钮
public JBtton(String text);创建一个带文本的按钮
public JBtton(Icon icon);//创建一个带图标的按钮
public JBtton(String text ,Icon icon);//创建一个带文本和图标的按钮
JButton类的常用方法以及说明
18.6.2JRadioButton单选按钮:
Swing单选按钮由JRadioButton对象表示,在Swing程序设计中,需要把多个单选按钮添加到按钮组中,当用户选中某哥单选按钮时,按钮组中的其他单选按钮将不能被同时选中
创建一个JRadioButton对象需要使用JRadioButton类的构造方法。JRadioButton类常用的构造方法如下:
public JRadioButton()//创建一个未被选中,文本违背定义的,具有指定图标的单选按钮
public JRadioButton(Icon icon)//创建一个违背选中的。文本违背选设定的,具有指定图标的单选按钮
public JRadioButton(Icon icon ,boolean selected)
//创建一个具有指定图标。选择状态,但文本未被选定的单选按钮
public JRadioButton(String text)//创建一个具有指定文本,单位本选定的单选按钮
public JRadioButton(String text , Icon icon)//创建一个具有指定的文本,指定图标,但未被选中的单选按钮
public JRadioButton(Stirng text,Icon icon ,boolean selected)//创建一个具有指定文本,指定图标和选择状态的单选按钮
如下代码所示:
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
public class RadioButtonTest extends JFrame {
public RadioButtonTest(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("单选按钮的使用");
setBounds(100,100,240,120);
getContentPane().setLayout(null);//设置绝对布局
JLabel lblNewLabel = new JLabel("请选择性别");
lblNewLabel.setBounds(5,5,120,15);
getContentPane().add(lblNewLabel);
JRadioButton rbtnNormal = new JRadioButton("楠");
rbtnNormal.setSelected(true);
rbtnNormal.setBounds(40,30,75,22);
getContentPane().add(rbtnNormal);
JRadioButton rbthPwd = new JRadioButton("女");
rbthPwd.setBounds(120,30,75,22);
getContentPane().add(rbthPwd);
ButtonGroup group =new ButtonGroup();//创建按钮组 把交互买哪般中的单选按钮添加到按钮组中
}
public static void main(String[] args) {
// TODO Auto-generated method stub
RadioButtonTest frame =new RadioButtonTest();//创建窗体对象
frame.setVisible(true);//使窗体可见
}
}
代码图以及允许结果图如下:
18.6.3JCheckBox复选框
复选框组件由JCeckBox对象标识,与单选按钮不同的时,窗体中的复选框可以被选中多个这是因为每一个复选框“被选中”和"不被选中"两种状态:
public JCeckBox();创建一个文本,图标未被设定为默认未被选中的复选框
public JCeckBox(Icon icon,Boolean checked)创建一个具有指定图标的,指定初始时释放被选中,但图标违背社厅复选框
public JCeckBox(String text Boolean checked);创建一个具有指定文本,指定初始时释放被选中,但图标设定的复选框
使用代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CheckBoxTest extends JFrame{
public CheckBoxTest() {
setBounds(100,100,170,110);//窗口坐标和大小
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();//获取主容器
c.setLayout(new FlowLayout());//容器使用流布局
JCheckBox c1=new JCheckBox("1");//创建复选框
JCheckBox c2=new JCheckBox("2");
JCheckBox c3=new JCheckBox("3");
c.add(c1);//添加复选框
c.add(c2);
c.add(c3);
JButton btn=new JButton("打印");//添加打印按钮
btn.addActionListener(new ActionListener() {//打印按钮动作时间
public void actionPerformed(ActionEvent e) {
System.out.println(c1.getText()+"按钮选中状态"+c1.isSelected());
System.out.println(c2.getText()+"按钮选中状态"+c2.isSelected());
System.out.println(c3.getText()+"按钮选中状态"+c3.isSelected());
}
});
c.add(btn);
setVisible(true);//容器添加了打印按钮
}
public static void main(String[] args) {
new CheckBoxTest();
}
}
代码图以及允许结果图如下:
18.7列表组件
Swing中提供两种列表组件,分别是下拉列表框与列表框。下拉列表框与列表框都是带有一系列列表组件,用户可以从中选择需要列表项,列表框较下拉列表框更直观,他将所有的列表向罗列在俩表中,但是,下拉列表框比较列表框更为便捷,美观,他将所有列表项隐藏起来,当用户选用其中列表向才会显现出来
18.7.1JcomboBox
第一次使用下拉列表框,会感觉Swing中下拉列表框与Windows系统中下拉列表框有一些相似,实质上两种并不完全相同,因为Swing中下来列表框不仅可以供用户从中选择,也提供了编辑列表项的功能 如下所示:
public JComboBox(ComboBoxModel dataModel)//创建一个JComboBox类是java.Swing.JCmboBox类的子类
public JComboBox(Object[]arrayData)//创建一个包含数组中的元素的JComboBox对象
public JComboBox(Vector vector)//创建一个包含指定Vector对象中的元素的JComboBox对象
使用方法如下:
import java.awt.event.*;
import javax.swing.*;
public class JComboBoxText extends JFrame {
public JComboBoxText() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("下拉列表框的使用");
setBounds(100,100,317,147);
getContentPane().setLayout(null);//设置绝对布局
JLabel lblNewlabel=new JLabel("请选择证件:");
lblNewlabel.setBounds(28,14,80,15);
getContentPane().add(lblNewlabel);
JComboBox<String>comboBox=new JComboBox<String>();//创建一个下来列表框
comboBox.setBounds(110,11,80,21);//设置坐标
comboBox.addItem("身份证");//为下来列表中添加项
comboBox.addItem("军人证");
comboBox.addItem("学生证");
comboBox.addItem("工作证");
comboBox.setEditable(true);
getContentPane().add(comboBox);//将下拉列表添加到容器中
JLabel IblResult=new JLabel("");
IblResult.setBounds(0,57,146,15);
getContentPane().add(IblResult);
JButton btnNewButton=new JButton("确定");
btnNewButton.setBounds(200,10,67,23);
getContentPane().add(btnNewButton);
btnNewButton.addActionListener(new ActionListener() {//为按钮添加监听事件
@Override
public void actionPerformed(ActionEvent e) {
IblResult.setText("您选择的是:"+comboBox.getSelectedItem());
}
});
}
public static void main(String[] args) {
JComboBoxText frame=new JComboBoxText();//创建窗体对象
frame.setVisible(true);
}
}
代码图以及允许结果图:
18.8文本组件
文本组件在开发Swing程序过程中经常被用到,尤其是文本框组件和密码框组件,使用文本组件可以轻松的操作单行文字,多行文字口令字段等文本内容
18.8.1JTextField文本框
文本框组件由JFextField对象表示JTextField类的常用构造方法如下:
public JTextField();创建一个文本未被指定的文本框
public JTextField(String text);创建一个指定文本的文本框
public JTextField(int fieldwidth);创建一个只当列宽的文本框
public JTextField(String text,int fieldwidth);创建以恶给指定为呢本列宽的文本框
public JTextField(Document docModel,String text,int fieldwidth);
//创建一个定制文本模型,文本内容和列宽的文本框
以下代码讲解使用方法:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextFieldTest extends JFrame{
public JTextFieldTest() {
Container c=getContentPane();//获取窗体工期
c.setLayout(new FlowLayout());
JTextField jt=new JTextField("请点击清除按钮");//设定文本框初始值
jt.setColumns(20);//设置文本框长度
jt.setFont(new Font("宋体",Font.PLAIN,20));//设置字体
JButton jb=new JButton("清除");
jt.addActionListener(new ActionListener() {//为文本框添加回车事件
public void actionPerformed(ActionEvent e) {//
jt.setText("触发事件");//设置文本框中的值
}
});
jt.addActionListener(new ActionListener() {//为按钮添加时间
public void actionPerformed(ActionEvent e) {
System.out.println(jt.getText());//输出当前文本框的值
jt.setText("");//将文本框置空
jt.requestFocus();//焦点回到文本框
}
});
c.add(jt);//窗体容器添加文本框
c.add(jb);//窗体添加按钮
setBounds(100,100,250,110);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JTextFieldTest();
}
}
代码图以及允许结果图如下:
18.8.2JPasswordField密码框
密码框组件由JPasswordField对象表示,其作用十八用户输入的字符串以某种符号进行加密类的常用构造方法如下JPasswordField类的构造方法如下:
public JPasswordField();创建一个文本未被指定的密码框
public JPasswordField(String text);创建一个指定的密码框
public JPasswordField(int fieldwidth);创建一个指定列宽的密码框
public JPasswordField(String text,int fieldwidth);创建个只当文本和列宽的密码框
public JPasswordField(Document docModel,String text,int fieldWidth);//创建一个指定文本模型和列宽的密码框
18.8.3JTextArea文本域
文本与组键JTextArea对象表示,起作用是接受用户多行文本输入,类的常用构造方法
JTextArea
public JTextArea();创建一个文本违背指定的文本域
public JTextArea(String tsxt);//创建一个指定文本的文本域
public JTextArea(int rows ,int columns);创建一个指定行高和列宽,但文本未被指定的文本域
public JTextArea(Docunment doc);//创建一个指定文档模型的文本域
public JTextArea(Document doc ,String Text ,int rows, intcolumns);创建一个指定文档母校,文本内容以及行高和列狂的文本域
主要的使用方法 如下例题所示:
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
public class JTextAreaTest extends JFrame {
public JTextAreaTest() {
setSize(200,100);//定义文本域长宽
setTitle("定义自动换行的文本域");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container cp =getContentPane();//获得窗体容器
//创建一个文本内容为"为文本域"行高和列宽均为6的文本域
JTextArea jt =new JTextArea("文本域",6,6);
jt.setLineWrap(true);//可以自动换行
cp.add(jt);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new JTextAreaTest();
}
}
代码如图以及运行结果如下所示
18.9表格组件
Swing表格JTable对象表示 其作用是把数据以表格的形式显示给用户
18.9.1创建表格
JTable类除了提供了默认的构造方法外,还提供了被用于显示二维数组中的元素的构造方法如下所示
JTable(Object[][] rowDate,Object[]columnNames)
rowDate//存储表格数据的二维数组
cilumnNames;//存储表格列明的一维数组
主要的使用方法如下所示:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class SortingTable extends JFrame {
private static final long serialVersionUID=1L;
public static void main(String[] args) {
SortingTable frame=new SortingTable();
frame.setVisible(true);
}
public SortingTable() {
setTitle("表格模型与表格");
setBounds(100,100,240,150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane=new JScrollPane();
getContentPane().add(scrollPane,BorderLayout.CENTER);
String[]columnNames= {"A","B"};//定义表格列名数组
String[][]tableValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"}};
//定义表格数据数组
DefaultTableModel tableModel=new DefaultTableModel(tableValues,columnNames);
//创建指定列明和数据的表格
JTable table=new JTable(tableModel);
//创建显示表格的滚动面板
table.setRowSorter(new TableRowSorter<>(tableModel));
//将滚动面板添加到边界布局的中
scrollPane.setViewportView(table);
}
}
代码图以及运行结果图如下:
18.9.2DefultTableModel表格数据模型
Swing使用TableModel接口定义了一个表格模型 AbstactTableModel抽象类实现了TableModel接口的大部分方法
public int getTowCount();
public intgetCikumnCount();
public Object getValueAt(int rowIndex,intcolumnIndex)
为了实现表格模型创建表格的功能,Swing提供了表格模型,即DefaultTableModel类继承了AbstractTableMode抽象类且显示了上述3个抽象方法类提供了常DefaultTableModel用构造方法
以下例题所示使用方法:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class SortingTable extends JFrame {
private static final long serialVersionUID=1L;
public static void main(String[] args) {
SortingTable frame=new SortingTable();
frame.setVisible(true);
}
public SortingTable() {
setTitle("表格模型与表格");
setBounds(100,100,240,150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane=new JScrollPane();
getContentPane().add(scrollPane,BorderLayout.CENTER);
String[]columnNames= {"A","B"};//定义表格列名数组
String[][]tableValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"}};
//定义表格数据数组
DefaultTableModel tableModel=new DefaultTableModel(tableValues,columnNames);
//创建指定列明和数据的表格
JTable table=new JTable(tableModel);
//创建显示表格的滚动面板
table.setRowSorter(new TableRowSorter<>(tableModel));
//将滚动面板添加到边界布局的中
scrollPane.setViewportView(table);
}
}
代码图以及运行结果图如下所示:
18.9.3维护表模型
表格中的数据内容要予以维护,如果使用getValueAt()方法获得表格中的某一俄国单元格的值,使用addRow()方法向表格中添加新的行,使用setValueAt()方法修改表格中的某一个单元格的值removeRow()方法从表格中删除指定行等
以下例题使用了对表格内容进行增删改查如下所示:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
public class AddAndDeleteDemo extends JFrame{
private DefaultTableModel tableModel;
private JTable table;
private JTextField aTextField;
private JTextField bTextField;
public static void main(String[] args) {
AddAndDeleteDemo frame =new AddAndDeleteDemo();
frame.setVisible(true);
}
public AddAndDeleteDemo() {
setTitle("维护表格模型");
setBounds(100,100,520,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JScrollPane scrollPane =new JScrollPane();
getContentPane().add(scrollPane,BorderLayout.CENTER);
String[] columnNames= {"A","B"};
//定义表格数据数组
String[][] tableValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"}};
//创建指定表格列明和表格数据的表格模型
tableModel =new DefaultTableModel(tableValues,columnNames);
table =new JTable(tableModel);
table.setRowSorter(new TableRowSorter<>(tableModel));
//设置表格的原则模式为单选
table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
//为表格添加鼠标事件监听器
table.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
int selectedRow= table.getSelectedRow();
//从表格模型中获得指定单元格的值
Object oa =tableModel.getValueAt(selectedRow, 0);
//从表格模型中获得指定单元格的值
Object ob =tableModel.getValueAt(selectedRow, 1);
aTextField.setText(oa.toString());
bTextField.setText(ob.toString());
}
});
scrollPane.setViewportView(table);
JPanel panel = new JPanel();
getContentPane().add(panel,BorderLayout.SOUTH);
panel.add(new JLabel("A:"));
aTextField =new JTextField("A14",10);
panel.add(aTextField);
panel.add(new JLabel("B:"));
bTextField=new JTextField("B4",10);
panel.add(bTextField);
JButton addButton =new JButton("添加");
addButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String[] rowValues = {aTextField.getText(),
bTextField.getText()};
tableModel.addRow(rowValues);
int rowCount =table.getRowCount()+1;
aTextField.setText("A"+rowCount);
bTextField.setText("B"+rowCount);
}
});
panel.add(addButton);
JButton updButton=new JButton("修改");
updButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selectedRow =table.getSelectedRow();
if(selectedRow !=-1) {
//修改表格模型中的指定值
tableModel.setValueAt(aTextField.getText(), selectedRow, 0);
//修改表格模型中的指定值
tableModel.setValueAt(aTextField.getText(), selectedRow, 1);
}
}
});
panel.add(updButton);
JButton delButton =new JButton("删除");
delButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selecedRow=table.getSelectedRow();
if(selecedRow !=-1)
tableModel.removeRow(selecedRow);
}
});
panel.add(delButton);
}
}
代码图以及运行结果图如下: