1、概述
Swing组件通常被称做“轻量级组件”,它完全由Java编写,不依赖操作系统语言。他的类继承关系如下图:
JComponnt是swing组件存放的位置,常用的组件如下:
JFrame
框架
JDialog
对话框
JOptionPane
对话框
JButton
按钮
JCheckBox
复选框
JComBox
下拉框
JLabel
标签
JRadioButton
单选按钮
JList
显示一组条目的组件
JTextField
文本框
JPasswordField
密码框
JTextArea
文本区域
2.常用的窗体
常用的窗体有两种,JFrame和JDialog
2.1 JFrame
JFrame是一个容器,他是各个组件的载体。在开发的过程中,我们通过继承java.swing.JFrame来创建要给窗体
一.新建JFrame对象
Frame() 创建没有标题窗口。Frame(String s)创建标题为s的窗口。二.设置JFrame的大小
public void setSize(int width,int height)设置窗口的大小。public void setLocation(int x,int y)设置窗口的位置,默认位置是(0,0)。public void setBounds(int a,int b,int width,int heigth)设置窗口的初始位置是(a,b),窗口的宽是width,高是heigth。 public void setVisible(boolean b)设置窗口是否可见,窗口默认不可见的。public void setResizble(boolean b)设置窗口是否可调整大小,默认可调整大小。 public void dispose()撤销当前窗口,并释放当前窗口所使用的资源。public void setExtendState(int state)设置窗口的扩展状态,其中参数state取JFrame类中的下列类常量:MAXIMIZED_HORIZ(水平方向最大化),MAXIMIZED_VERT(垂直方向最大化),MAXIMIZED_BOTH(水平、垂直方向都最大化)。三.设定JFrame的关闭方式
public void setDefaultCloseOperation(int operation)该方法用来设置单击窗体右上方的关闭图标后,程序会做出怎样的处理,其中的参数operation取JFrame类中的下列int型static常量,程序根据参数operation取值做出不同的处理:DO_NOTHING_ON_CLOSE (什么也不做)HIDE_ON_CLOSE (隐藏当前窗口) DISPOSE_ON_CLOSE(隐藏当前窗口,并释放窗体占有的其他资源), EXIT_ON_CLOSE(结束窗口所在的应用程序)。public static void main(String[] args){ JFrame jf=new JFrame("hello"); //jf.setSize(400,250); //jf.setLocation(400,300); jf.setBounds(400,300,400,250); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}2.2 JDialog
继承自java.awt.Dialog类。他是从一个窗体弹出来的另一个窗体。他和JFrame类似,
JDialog:可当成一JFrame使用,但必须属于JFrame构造函数
JDialog();JDialog(Frame f); //指定父窗口JDialog(Frame f, String title); //指定父窗口 + 标题3.常用的面板
面板也是一种swing容器,他可以作为容器添加容纳其他的组件,但是他必须加在一个容器内。
3.1JPanel
Jpanel就是一种最简单的面板,他继承自java.awt.Container类。
JFrame jf= new JFrame("Frame");jf.setBounds(400,300,1200,1200);jf.setVisible(true);JButton jb=new Jbutton("香蕉");JButton jb2=new JButton("草莓");JPanel jp=new Jpanel(new Flowayout()); //生成一个面板jp.add(jb);jp.add(jb2);jf.add(jp); //将面板加入到另外的容器中3.2 JScrollPane
JScrollPane是带滚动条的面板。因此,在碰到需要将一个大的组件放到一个较小的空间的时候,使用该面板。JScrollPane内只能添加一个组件;因此,如果需要将多个组件添加到一个JScrollPane中时,需要先将需要添加的组件添加到JPanel中,再将JPanel添加到JScrollPane中。
JFrame jf = new JFrame("Frame");jf.setBounds(400,300,1200,200);jf.setVisible(true);JButton jb=new JButton("香蕉");jb.setSize(800,200);JScrollPane jp=new JScrollPane(jb);jf.add(jp);4.常用的组件
4.1 标签组件
类:JLabel
作用:显示文本或者提示信息
构造函数:
new JLabel();new JLbel(Icon icon); //设置图标new JLabel(Icon icon, int aligment); //设置图标+水平对齐方式new JLabel(String str,int aligment); //设置文本+水平对齐方式 LEFT、CENTER、RIGHTnew JLabel(String str,Icon icon ,int aligment); //设置文本+图标+水平对齐方式JFrame jf=new JFrame("Frame");jf.setBounds(400,300,1000,1300);JLabel jlabel=new JLabel();jlabel.setText("账号");jf.add(jlabel);jf.setVisible(true);jf.setDefaultCloseOperation(WindowsConstants.EXIT_ON_CLOSE);4.2图标
接口:Icon
作用:可以设置在按钮,标签等组件上。
接口必须实现的方法:
public int getIconHeight();public int getIconWidth();public void paintIcon(Component arg(),Graphics arg1,int agr2,int agr3);//在指定坐标位置画图有两个方法可以实现一个Icon,①使⽤java.awt.Graphics类提供的功能来画图;②使⽤ Java⽀持的图⽚⽂件类型进⾏创建。
①使⽤java.awt.Graphics类提供的功能来画图
class MyIcon implements Icon{ private int width; private int height; public int getIconHeight(){ return heght; } public int getIconWidth(){ return width; } public MyIcon(int width,int heigth){ this.width=width; this.height=height; } public void paintIcon(Component arg0, Graphics arg1, int x, int y){ arg1.fillOval(x,y,width,height); }};②使⽤ Java⽀持的图⽚⽂件类型进⾏创建。
实⽤类 javax.swing.ImageIcon 类来根据现有的图⽚创建图标,该类也是实现了Icon接⼜。
构造函数:
ImageIcon();ImageIcon(Image image); //从图片创建图标ImageIcon(Image image,String description); //指定了图片+描述ImageIcon(URL url);4.3按钮
类:JButton
构造方法:
JButton();JButton(String text); //指定文字JButton(Icon icon); //指定图标JButton(String text,Icon icon); //指定文字+图标其他方法:
setTooltipText(String text); //设置提示文字setBroderPainted(); //设置边界是否显示setEnabled(); //设置按钮是否可用JFrame jf= new JFrame("Frame");jf.setLayout(new FlowLayout());jf.setBounds(400,300,200,300);JButton jb=new JButton("按钮1");jb.setEnabled(true);jb.setBorderPainted(false);jf.add(jb);jf.setVisible(true);jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);4.4单选按钮组件
类:JRadioButton ButtonGroup
说明:JRaddioButton是一个单选按钮,需要将单选按钮加入到按钮组中。
构造方法:
JRadioButton();JRadioBUtton(Icon icon); //指定图标JRadioBUtton(Icon icon, bollean selected); //指定图标+是否选中JRadioButton(String text); //指定文字JRadioButton(String text,Icon icon); //指定文字+图标JRadioButton(String text,Icon icon,boolean selected); //指定文字+图标+是否选中示例:
JFrame jf=new JFrame("Frame");jf.setLayout(new FlowLayout());jf.setBounds(400,300,200,300);JRadioButton jrb=new JRadioButton("男");JRadioButton jrb2=new JRadioButton("女");ButtonGroup bg=new ButtonGroup();bg.add(jrb);bg.add(jrb2);jf.add(jrb);jf.add(jrb2);jf.setVisible(true);jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);4.5复选组件框
类:JCheckBox
构造方法:
JCheckBox();JCkeckBox(Icon icon,boolean checked); //指定图标+是否被选中JCheckBox(String text,boolean checked) //指定文字+是否被选中JFrame jf=new Jframe("Frame"); jf.setLayout(new FlowLayout()); jf.setBounds(400,300,200,300); JCheckBox jcb1=new JCheckBox("篮球"); JCheckBox jcb2=new JCheckBox("音乐"); JCheckBox jcb3=new JCheckBox("代码"); JCheckBox jcb4=new JCheckBox("睡觉"); jf.add(jcb1); jf.add(jcb2); jf.add(jcb3); jf.add(jcb4); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);4.6下拉列表框组件
类:JComboBox
构造方法:
JComboBox(); //常用JComboBox(ComboBoxModel dataModel); //使用listMode建立一个下拉列表JComboBox(Object[] arrayData);JComboBox(Vector vector);方法: addItem 添加下拉内容示例:
JFrame jf=new JFrame("Frame"); jf.setLayout(new FlowLayout()); jf.setBounds(400,300,300,100); JComboBox box=new JComboBox(); box.addItem("--请选择你的学历--"); box.addItem("高中"); box.addItem("大学"); box.addItem("研究生"); jf.add(box); jf.setVisible(true); jf.setDefaultCloseOperation(WindowContants.EXIT_ON_CLOSE);4.7菜单栏
一级菜单的: 1创建菜单条 JMenuBar 2创建菜单 JMenu 3创建菜单项 JMenuItem 总结:菜单项依附菜单,菜单依附菜单条创建菜单栏
创建菜单
创建菜单项
菜单添加一个菜单项
菜单栏添加菜单
JFrame jf=new JFrame ("Frame"); jf.setBounds(400,300,300,100); JMenuBar bar=new JMenuBar(); JMenu menu=new JMenu("菜单1"); JMenuItem item1=new JMenuItem("二级菜单1"); JMenuItem item2=new JMenuItem("二级菜单2"); JMenuItem item3=new JMenuItem("二级菜单3"); menu.add(item1); menu.add(item2); menu.add(item3); bar.add(menu); jf.setVisible(true); jf.setDefaultCloseOperation(WindowContants.EXIT_ON_CLOSE);多级菜单的:创建菜单栏
创建多个菜单
创建多个菜单项
菜单添加多个菜单项
菜单栏添加菜单
JFrame jf=new JFrame("Frame"); jf.setBounds(400,300,300,100); JMenuBar bar=new JMenuBar(); JMenu menu=new JMenu("菜单1"); JMenu menu2=new JMenu("菜单2"); JMenuItem item1=new JMenuItem("二级菜单1"); JMenuItem item2=new JMenuItem("二级菜单2"); JMenuItem item3=new JMenuItem("二级菜单3"); JMenuItem item4=new JMenuItem("二级菜单4"); JMenuItem item5=new JMenuItem("二级菜单5"); JMenuItem item6=new JMenuItem("二级菜单6"); menu.add(item1); menu.add(item2); menu.add(item3); menu.add(item4); menu.add(item5); menu.add(item6); bar.add(menu); bar.add(menu2); jf.add(bar); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);4.8文本组件
类:JTextField
构造函数:
JTextField();JTextField(String text); //指定默认文字JTextField(int fielWidth); //指定文本框长度JTextField(String text, int fieldWidth); //指定默认文字+文本框长度JTextField(Document docModel, String text, int fieldWidth); //指定文本框模式+默认文字+文本框长度JFrme jf=new JFrame("Frame"); jf.setLayout(new FlowLayout()); jf.setBounds(400,300,300,100); JLabel label=new JLabel("账号"); JTextField text=new JTextField("请输入账号",20); text.setSize(20,30); jf.add(label); jf.add(text); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);4.9密码框组件
类:JPasswordField
构造函数:
JPasswordField();JPasswordField(String str); //指定默认文字JPasswordField(int fieldWidth); //指定文本框长度JPasswordField(String text,int fieldWidth); //指定默认文字+文本框长度JPasswordField(Document doModel,String text,int fieldWidth); //指定文本模式+默认文字+文本框长度其他常用方法:
setEchoChar("*"); //设置回显字符JFrame jf = new JFrame("Frame"); jf.setLayout(new FlowLayout()); jf.setBounds(400,300,300,100); JLabel label = new JLabel("账号:"); JTextField text = new JTextField("请输入账号",20); text.setSize(20,30); JLabel label2 = new JLabel("密码:"); JPasswordField pwd = new JPasswordField("请输⼊密码", 20); jf.add(label); jf.add(text); jf.add(label2); jf.add(pwd); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);4.10文本域组件
类:JTextArea
构造函数:
JTextArea();JTextArea(String text); //指定默认文字JTextArea(int rows,int cols); //指定行 列JTextArea(Document doc); //指定文本模型JTextArea(Document doc,String text,int rows,int cols); //指定文本模型+默认文字+长+宽其他常用方法:
setLineWrap(); //设置文本域是否自动换行JFrame jf = new JFrame("Frame"); jf.setLayout(new FlowLayout()); jf.setBounds(400,300,300,100); JTextArea area = new JTextArea(12, 20); jf.add(area); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);5.常用的布局
5.1流布局FlowLayout
所有组件像流一样,一个一个排放,流满了一行之后排下一行。默认情况下,每个组件是居中排列的,但是也可以设置。
流布局的构造方法:
FlowLayout();FlowLayout(int aligment); //设置对齐方式(默认为FlowLayout.CENTER居中),我们一般改为FlowLayout.LEFTFlowLayout(int aligment,int horizGap,int vertGap); //设置对齐方式+上下偏移aligment取值: FlowLayout.LEFT=0 FlowLayout.CENTER=1 FlowLayout.RIGHT=2通过setLayout函数来设置布局:例如:j f.setLayout(new FlowLayout(FlowLayout.LEFT));
JFrame jf = new JFrame("Frame"); jf.setLayout(new FlowLayout(FlowLayout.LEFT)); jf.setBounds(400,300,300,100); JButton button1 = new JButton("A"); JButton button2 = new JButton("B"); JButton button3 = new JButton("C"); JButton button4 = new JButton("D"); JButton button5 = new JButton("E"); jf.add(button1); jf.add(button2); jf.add(button3); jf.add(button4); jf.add(button5); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);5.2边界布局BorderLayout
边界布局是默认的布局管理方式,边界布局将容器分成了东(BorderLayout.NORTH)、南(BorderLayout.SOUTH)、西(BorderLayout.EAST)、北(BorderLayout.WEST)、中(BorderLayout.CENTER) 5个区域。
1、在new的时候指定内容
2、在给jFrame容器add组件的时候,指定边界
JFrame jf = new JFrame("Frame"); jf.setLayout(new BorderLayout()); jf.setBounds(400,300,300,100); JButton button1 = new JButton("北部"); JButton button2 = new JButton("东部"); JButton button3 = new JButton("南部"); JButton button4 = new JButton("⻄部"); JButton button5 = new JButton("中⼼"); jf.add(button1,BorderLayout.NORTH); jf.add(button2,BorderLayout.EAST); jf.add(button3,BorderLayout.SOUTH); jf.add(button4,BorderLayout.WEST); jf.add(button5,BorderLayout.CENTER); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);5.3网格布局管理器
⽹格布局是将容器划分为⽹格;所有的组件都按照⾏和列排列,⽹格的个数由⾏数和列数决定。每个组件会填满空格,改变容器的⼤⼩,组件的⼤⼩也会随之改变。构造方法:
GridLayout(int rows,int columns); //指定行数,列数GridLayout(int rows,int columns,int horizGap,int verGap); //指定行数+列数+水平间隔+垂直间隔JFrame jf = new JFrame("Frame"); jf.setLayout(new GridLayout(3,3,10,10)); jf.setBounds(400,300,300,100); JButton button1 = new JButton("A"); JButton button2 = new JButton("B"); JButton button3 = new JButton("C"); JButton button4 = new JButton("D"); JButton button5 = new JButton("E"); JButton button6 = new JButton("F"); JButton button7 = new JButton("G"); JButton button8 = new JButton("H"); JButton button9 = new JButton("I"); jf.add(button1); jf.add(button2); jf.add(button3); jf.add(button4); jf.add(button5); jf.add(button6); jf.add(button7); jf.add(button8); jf.add(button9); jf.setVisible(true); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);6.常用的事件监听器
6.1一个事件模型中用三个对象:事件源,事件,以及监听程序。
事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做出的处理方案 D:事件监听 就是吧事件源和事件关联起来事件
时间源
监听接口
方法
动作事件监听器
ActionEvent
JButton, JList, JTextField等
ActionListener
addActionListener(),removeActionListener()
焦点事件监听器
FocusEvent
Component及其派生
FocusListener
addActionListener(),removeActionListener()
使用步骤:
1. 新建一个组件 (如JButton)。 2. 将该组件添加到相应的面板(如JFrame)。 3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。 4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。