swing用于开发桌面窗体程序用于JDK的第二代GUI框架,其功能比JDK第一代GUI框架AWT更为强大,性能更加优良。但因为Swing技术推出时间太早,七性能,开发效率等不及一些其他的留下技术,所以目前市场大多数桌面窗体都不是由java开发的,Swing技术也书简被广大开发人员放弃了
不过Swing是JDK自带的功能,并且能非常好的体现出java语言在面对对象,接口时间等方面设计模式,又能提供直观的呈现运行效果,有所以本书还能纳入此内容,本章不能深入的讲解Swing技术,仅会介绍一些常用组件的使用方法
Swing中大多数数组件均为轻量级组件,使用Swing开发出的窗体风格与当前平台(如WindowsLinux等)的窗体风格保持一致 本章讲解了主要介绍了Swing的基本要素,包括窗体的布局,容器,常用组件,如何创建表格等内容
Swing概述
Swing主要用来开发GUI(Graphical User Interface)程序,GUI是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮等图形界面元素,我们经常使用的QQ软件、360安全卫士等均为GUI程序。Java语言为Swing程序的开发提供了丰富的类库,这些分别被储存在java.awt和javax.swing包中。Swing提供了丰富的组件,在开发Swing程序时,这些组件被广泛的应用。
创建一个不可的,具有标题的窗体如下:
Swing常用窗体
JFrame窗体
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语言提供了多种窗体的关闭方式,
窗体关闭方式 实现功能
DO_NOTHING_ON_CLOSE 关闭窗体时,不触发任何操作
DISPOSE_ON_CLOSE 关闭窗体时,释放窗体资源,窗体会消失但是程序不会停止
HIDE_ON_CLOSE 关闭窗体时,仅隐藏舱体,不释放资源
EXIT_ON_CLOSE 关闭窗体时,释放窗体资源并关闭程序
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小型对话框
一个非常便捷的小型对话框,该类用于创建对话框的方法都是静态方法,无需创建对象即可弹出,在日常开发中经常使用该类唐初提示确认用户需求
方法 描述
showConfirmDialog() 确认框,询问一个确认问题,如yes/no/cancel
showIputDialog() 输入框,可以让用户向程序输入某些之
showMessageDialog() 通知框,告知用户某事已经发生
showOptionDialog() 自定义对话框,集合了上述3种对话框的全部功能
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);
}
}
package 十八章;
import javax.swing.JOptionPane;
public class Demo {
public static void main(String[] args) {
int answer=JOptionPane.showConfirmDialog(null, "确定离开吗?","标题",JOptionPane.YES_NO_CANCEL_OPTION);
}
}
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);
}
}
null绝对布局
绝对布局也叫做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
alignment参数值 说明
FlowLayout.LEFT 每一行组件的排列方式被指定为左对齐
FlowLayout.CENTER 每一行组件的排列方式被指定为剧中对齐
FlowLayout.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类的常用方法以及说明
方法 说明
SetIcon(Icon defauItIcon) 设置按钮图案
setToolTipText(String text) 为按钮设置提示文字
setBorderPainted(boolean b) 如果b的值为true且按钮又边框,那么绘制边框borderPainted属性的默认值为true
setEnable(boolean b) 这是按钮释放可用。b的值为true时,表示按钮可用;b的值为false时表示按钮不可用
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()方法从表格中删除指定行等
package 十八章;
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);
}
}
18.10ActionEvent动作事件
动作时间(ActionEvent)监听器是Swing中比较常用的事件监听器 很多组件的动作都会使用它监听,如下三种
相关定义 实现方式 相关定义 实现方式
事件名 ActionEvent 添加监听方法 addAtionListener()
事件源 JButton,Jlist,STextField等组件 删除监听方法 reniveActuibListener()
监听接口 ActionListener
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class SimpleEvent extends JFrame {
private JButton jb=new JButton("我是按钮,点击我");
public SimpleEvent() {
setLayout(null);
setSize(200,100);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container cp=getContentPane();
cp.add(jb);
jb.setBounds(10,10,150,30);
jb.addActionListener(new jbAction());
setVisible(true);
}
class jbAction implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
jb.setText("我被点击了");
}
}
public static void main(String[] args) {
new SimpleEvent();
}
}
18.10.2KeyEvent键盘事件
当想文本框中输入内容是,将发生键盘事件,keyEvent类赋值捕获键盘事件,而可以通过为组件添加实现KeyListener接口的监听器类里处理相印的键盘事件 如下三种抽象方法
public inteface KeyListener extends ExventListener{
public void ketTyped(KeyEvent e)//发生击键事件时被触发
public void ketPressed(KeyEvent e)//案件被按下按时触发
public void keyReleased(KeyEvent e)}//按键被释放时触发
如下例题所示:
textField = new JTextField();
textField.addKeyListener(new KeyAdapter() { // 文本框添加键盘事件的监听
char word;
@Override
public void keyPressed(KeyEvent e) { // 按键被按下时被触发
word = e.getKeyChar();// 获取按下键表示的字符
for (int i = 0; i < btns.size(); i++) {// 遍历存储按键ID的ArrayList集合
// 判断按键是否与遍历到的按键的文本相同
if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {
btns.get(i).setBackground(green);// 将指定按键颜色设置为绿色
}
}
}
@Override
public void keyReleased(KeyEvent e) { // 按键被释放时被触发
word = e.getKeyChar();// 获取释放键表示的字符
for (int i = 0; i < btns.size(); i++) {// 遍历存储按键ID的ArrayList集合
// 判断按键是否与遍历到的按键的文本相同
if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {
btns.get(i).setBackground(white);// 将指定按键颜色设置为白色
}
}
}
});
panel.add(textField, BorderLayout.CENTER);
textField.setColumns(10);
}
}
18.10.3MouseEvent鼠标事件
所有组件都能发生鼠标事件MouseEvent类赋值捕捉鼠标事件,可以通过为组件添加了MouseListener接口的监听器类来处理像相应的鼠标事件 如下所示:
public inerfacce MouseListener extendx EventListener{
public void mouseEntered(NouseEvent e);//光标一如组件时被触发
public void mousePressed(NouseEvent e)//光标案件被按下触发
public void mouseReleased(NouseEvent e)//鼠标案件被释放时触发
public void mouseClicke(NouseEvent e)//发生单击事件时被触发
public void mouseExited(NouseEvent e)//光标溢出组件时被触发
}
如下例题所示:
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MouseEventDemo extends JFrame { // 继承窗体类JFrame
public static void main(String args[]) {
MouseEventDemo frame = new MouseEventDemo();
frame.setVisible(true); // 设置窗体可见,默认为不可见
}
/**
* 判断按下的鼠标键,并输出相应提示
*
* @param e 鼠标事件
*/
private void mouseOper(MouseEvent e) {
int i = e.getButton();
if(i==MouseEvent.BUTTON1)
System.out.println("按下的时鼠标左键");
else if(i==MouseEvent.BUTTON2)
System.out.println("按下的时鼠标滚轮");
else if(i==MouseEvent.BUTTON3)
System.out.println("按下的时鼠标右键");
}
public MouseEventDemo() {
super(); // 继承父类的构造方法
setTitle("鼠标事件示例"); // 设置窗体的标题
setBounds(100, 100, 500, 375); // 设置窗体的显示位置及大小
// 设置窗体关闭按钮的动作为退出
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel label = new JLabel();
label.addMouseListener(new MouseListener() {
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("光标移入组件");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按键被按下");
mouseOper(e);
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标按键被释放");
mouseOper(e);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("单击了鼠标按键");
mouseOper(e);
int clickCount=e.getClickCount();
System.out.println("单机次数为"+clickCount+"下");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("光标移出组件");
}
});
getContentPane().add(label, BorderLayout.CENTER);
}
}