1.Swing的特点
原来的AWT组件来自于java.awt包,在不同的开发平台上显示的时候会表现出不同的风格,但是Swing开发的程序可以同一组件的风格,不依赖操作系统。
Swing是完全由Java编写,是轻量级组件,不依赖操作系统
2.流动布局管理器
package com.Adder;
import javax.swing.*;
import java.awt.*;
public class Flow_Layout extends JFrame {
public Flow_Layout(){
setBounds(500,500,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setTitle("浮动布局管理器窗体");
Container container=getContentPane();
container.setLayout(new FlowLayout(FlowLayout.LEFT));//给容器设置流布局管理器,流布局默认的是居中对齐,
// 可以用参数LEFT\CENTER\RIGHT参数修改布局
for (int i=0;i<10;i++){
container.add(new JButton("按钮"+i));
System.out.println("按钮");
}
setVisible(true);
}
public static void main(String[] args) {
new Flow_Layout();
}
}
3.边界布局管理器
package com.Adder;
import javax.swing.*;
import java.awt.*;
/*
*边界布局将容器分为东西南北中五个部分
* 注意:
* 1.添加组件的时候要指定区域,否则默认添加在center区
* 2.同一区域的组件会相互覆盖
*3.改变窗体的大小,窗体中的按钮的大小随之改变,布满整个窗体
* */
public class Border_Layout extends JFrame {
public Border_Layout(){
this.setBounds(500,500,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container=getContentPane();
container.setLayout(new BorderLayout());
JButton button1=new JButton("按钮1"),
button2=new JButton("按钮2"),
button3=new JButton("按钮3");
button1.setBounds(100,100,100,100);
container.add(button1,BorderLayout.CENTER);//设置按钮额度布局为中部布局
container.add(button2,BorderLayout.EAST);
container.add(button3,BorderLayout.WEST);
this.setVisible(true);
}
public static void main(String[] args) {
new Border_Layout();
}
}
4.网格布局管理器
package com.Adder;
import javax.swing.*;
import java.awt.*;
/*
* 两种构造方式:1.new GridLayout(列、行);2.new GirdLayout(列,行,水平间距,垂直间距)
*组件的大小随窗体大小改变
* 如果网格数小于组件数,就会自动优化布局,将列扩大
* */
public class Grid_Layout extends JFrame {
public Grid_Layout(){
this.setBounds(500,500,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container=getContentPane();
container.setLayout(new GridLayout(7,3,5,5));//设置为网格布局,7行3列,水平间距5像素,垂直间距5像素
for (int i=0;i<20;i++){
container.add(new JButton("按钮"+i));
}
this.setVisible(true);
}
public static void main(String[] args) {
new Grid_Layout();
}
}
5.网格组布局管理器
GridBagConstraints常用属性:
package com.Adder;
import javax.swing.*;
import java.awt.*;
/*
* 1.网格布局管理器中的组件只能放在网格中
* 2.网格组布局管理器,组件摆放比较灵活,但是代码量比较大
*
* 使用网格组布局的方法
* 1.创建对象网格组布局
* 2.容器对象采用网格组布局G
* 3.创建组件的约束对象
* 4.将组件的约束对象添加到容器中
* 网格组布局存在一个抽象的网格,网格上的行与列都有对应的编号,
* */
public class GridBdg_Layout {
JFrame jFrame = new JFrame();//主窗体
Container container;//主容器
public void createFrame() {
jFrame.setSize(800, 800);//设置窗体大小
jFrame.setLocationRelativeTo(null);//设置窗体在屏幕居中显示
container = jFrame.getContentPane();//获取容器
container.setLayout(new GridBagLayout());//获取窗体容器,设置网格组布局管理器
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭方式
}
public void init() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
g1.gridx = 0;//设置在网格的第一行第一列
g1.gridy = 0;
container.add(new JButton("组件1"), g1);
GridBagConstraints g2 = new GridBagConstraints();//创建约束条件的类
g2.gridx = 1;//设置在网格的第2行第2列
g2.gridy = 1;
container.add(new JButton("组件2"), g2);
GridBagConstraints g3 = new GridBagConstraints();//创建约束条件的类
g3.gridx = 2;//设置在网格的第3行第3列
g3.gridy = 2;
container.add(new JButton("组件3"), g3);
/*
* 注意:如果从第三行第三列直接到第五行第五列,第四行第四列由于没有组件,第五行第五列的组件会填充到第四行第四列
* */
}
public void createButton() {
for (int i = 0; i < 10; i++) {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
g1.gridx = i;//设置在网格的第3行第3列
g1.gridy = 0;
container.add(new JButton("组件x"), g1);
GridBagConstraints g2 = new GridBagConstraints();//创建约束条件的类
g2.gridx = 0;//设置在网格的第3行第3列
g2.gridy = i;
container.add(new JButton("组件y"), g2);
}
}
public void init1() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
container.add(new JButton("组件1"), g1);
g1.gridx = 1;//设置在网格的第一行第一列
g1.gridy = 1;
container.add(new JButton("组件1"), g1);
GridBagConstraints g2 = new GridBagConstraints();//创建约束条件的类
g2.gridx = 2;//设置组件在在网格中的位置是的第2行第2列
g2.gridy = 2;
g2.gridwidth = 2;//设置组件在网格中占几行几列
g2.gridheight = 1;
container.add(new JButton("组件2"), g2);
GridBagConstraints g3 = new GridBagConstraints();//创建约束条件的类
g3.gridx = 4;//设置在网格的第3行第3列
g3.gridy = 3;
g3.gridwidth = 2;
g3.gridheight = 2;
container.add(new JButton("组件3"), g3);
}
public void init2() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
container.add(new JButton("组件1"), g1);
g1.gridx = 1;//设置在网格的第一行第一列
g1.gridy = 1;
container.add(new JButton("组件1"), g1);
GridBagConstraints g2 = new GridBagConstraints();//创建约束条件的类
g2.gridx = 2;//设置组件在在网格中的位置是的第2行第2列
g2.gridy = 1;
g2.gridwidth = 2;//设置组件在网格中占几行几列
g2.gridheight = 2;
g2.fill = GridBagConstraints.HORIZONTAL;
container.add(new JButton("组件2 HORIZONAL"), g2);
GridBagConstraints g3 = new GridBagConstraints();//创建约束条件的类
g3.gridx = 5;//设置在网格的第3行第3列
g3.gridy = 1;
g3.gridwidth = 2;
g3.gridheight = 2;
g3.fill = GridBagConstraints.VERTICAL;
container.add(new JButton("组件3 VERTIAL"), g3);
GridBagConstraints g4 = new GridBagConstraints();//创建约束条件的类
g4.gridx = 8;//设置在网格的第3行第3列
g4.gridy = 1;
g4.gridwidth = 2;
g4.gridheight = 2;
g4.fill = GridBagConstraints.BOTH;
container.add(new JButton("组件3 BOTH"), g4);
}
public void init3() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
/*container.add(new JButton("组件1"),g1);*/
g1.gridx = 1;//设置在网格的第一行第一列
g1.gridy = 1;
g1.gridwidth = 2;//设置组件在网格中占几行几列
g1.gridheight = 2;
g1.anchor = GridBagConstraints.NORTH;//设置组件所在的方位为北
container.add(new JButton("组件1"), g1);
g1.fill = GridBagConstraints.BOTH;//填充方式为全部填充
JPanel jp = new JPanel();
jp.setBackground(Color.green);
container.add(jp, g1);
GridBagConstraints g2 = new GridBagConstraints();//创建约束条件的类
g2.gridx = 3;//设置组件在在网格中的位置是的第2行第2列
g2.gridy = 1;
g2.gridwidth = 2;//设置组件在网格中占几行几列
g2.gridheight = 2;
g2.anchor = GridBagConstraints.SOUTH;//设置组件所在的方位为南
g2.fill = GridBagConstraints.HORIZONTAL;//左右填充
container.add(new JButton("组件2"), g2);
g2.fill = GridBagConstraints.BOTH;//填充方式为全部填充
/*g2.anchor=GridBagConstraints.HORIZONTAL;*/
JPanel jp2 = new JPanel();
jp2.setBackground(Color.red);
container.add(jp2, g2);
GridBagConstraints g3 = new GridBagConstraints();//创建约束条件的类
g3.gridx = 5;//设置在网格的第3行第3列
g3.gridy = 1;
g3.gridwidth = 2;
g3.gridheight = 2;
g3.fill = GridBagConstraints.VERTICAL;//上下填充
container.add(new JButton("组件3"), g3);
g3.fill = GridBagConstraints.BOTH;
JPanel jp3 = new JPanel();
jp3.setBackground(Color.BLUE);
container.add(jp3, g3);
}
/*
* 可以使用inserts属性来自定义组件在单元格中的位置
*inserts是一个类,使用四个值来设置组件在单元格中的属性,这四个值是inserts构造方法的四个参数
* inserts(top,left,bottom,right),四个参数的单位是像素,类型为int
* */
public void init5() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
/*container.add(new JButton("组件1"),g1);*/
g1.gridx = 1;//设置在网格的第一行第一列
g1.gridy = 1;
/*g1.gridwidth=2;//设置组件在网格中占几行几列
g1.gridheight=2;*/
g1.insets = new Insets(10, 5, 10, 10);
container.add(new JButton("组件1"), g1);
}
/*
* ipadx和ipady属性定义组件的首选大小
* */
public void init6() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
/*container.add(new JButton("组件1"),g1);*/
g1.gridx = 1;//设置在网格的第一行第一列
g1.gridy = 1;
g1.ipadx = 10;
g1.ipady = 10;
g1.gridwidth = 2;//设置组件在网格中占几行几列
g1.gridheight = 2;
g1.insets = new Insets(10, 5, 10, 10);
container.add(new JButton("组件1"), g1);
g1.fill = GridBagConstraints.BOTH;//填充方式为全部填充
JPanel jp = new JPanel();
jp.setBackground(Color.green);
container.add(jp, g1);
GridBagConstraints g2 = new GridBagConstraints();//创建约束条件的类
/*container.add(new JButton("组件1"),g1);*/
g2.gridx = 3;//设置在网格的第一行第一列
g2.gridy = 1;
g2.ipadx = -5;
g2.ipady = -5;
g2.gridwidth = 2;//设置组件在网格中占几行几列
g2.gridheight = 2;
g2.insets = new Insets(10, 5, 10, 10);
container.add(new JButton("组件1"), g2);
g2.fill = GridBagConstraints.BOTH;//填充方式为全部填充
/*g2.anchor=GridBagConstraints.HORIZONTAL;*/
JPanel jp2 = new JPanel();
jp2.setBackground(Color.red);
container.add(jp2, g2);
}
/*
* weightx和weighty,设置一个单元个的最大宽和高
* 默认情况下,一个组件如果正好填满一个单元格,但是当拉大窗体的时候,单元格会变大,但是组件并不会变大
* 当设置了weightx和weighty之后,组件的大小就会随着单元格的大小的改变而改变
* */
public void init7() {
GridBagConstraints g1 = new GridBagConstraints();//创建约束条件的类
g1.gridx = 1;
g1.gridy = 1;
g1.weightx=2;
g1.weighty=2;
container.add(new JButton("组件1"), g1);
}
public static void main(String[] args) {
GridBdg_Layout bdg_layout = new GridBdg_Layout();
bdg_layout.createFrame();
bdg_layout.createButton();
bdg_layout.init7();
bdg_layout.jFrame.setVisible(true);
}
}
6.下拉列表
package com.Adder;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/*
* 下拉框
* */
public class JCombo_Box extends JFrame {
public JCombo_Box(){
this.setBounds(500,400,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container=this.getContentPane();//获取容器
container.setLayout(null);//设置绝对布局
/*JComboBox可以保存泛型
* 如添加String表示下拉列表中的元素都是字符串
* */
/* JComboBox<String> comboBox=new JComboBox<>();
*//* comboBox.addItem("身份证");
comboBox.addItem("学生证");
comboBox.addItem("军人证");*/
/*
* 第二种方式创建下拉列表->构架一个字符串数组,并将这个字符串数组当作参数传入下拉框
* */
/*String[] items = {"数组元素1", "数组元素1", "数组元素1"};
JComboBox<String> comboBox=new JComboBox<>(items);*/
/*
* 第三种创建架下拉列表的方法,实现一个下拉列表模型接口
* ComboBoxModel是一个接口
* */
String[] items = {"数组元素1", "数组元素2", "数组元素3"};
JComboBox<String> comboBox=new JComboBox<>();
ComboBoxModel<String> comboBoxModel=new DefaultComboBoxModel<>(items);//床架一个下拉列表的模型
comboBox.setModel(comboBoxModel);//向列表中添加数据模型
/*获取选中的值*/
JButton button=new JButton("打印");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("选中的元素的索引:"+comboBox.getSelectedIndex());//获取选中的索引
System.out.println("选中的元素的值:"+comboBox.getSelectedItem());//获取选中的元素的值
}
});
button.setBounds(240,20,70,30);//设置按钮的位置和大小
container.add(button);
comboBox.setEditable(true);//设置下拉框中的内容是否可以编辑
comboBox.setBounds(20,20,200,30);//设置下拉列表的坐标和大小
container.add(comboBox);//将下拉列表添加到容器中
this.setVisible(true);
}
public static void main(String[] args) {
new JCombo_Box();
}
}
7.列表框
/*
* 列表框
* */
public class J_list extends JFrame {
public J_list() {
this.setBounds(500, 500, 500, 500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container = this.getContentPane();
container.setLayout(null);
String[] items1 = {"元素1", "元素1", "元素1", "元素1", "元素1", "元素1", "元素1"};
DefaultListModel<String> dlm = new DefaultListModel<>();//创建列表框数据模型
for (String temp : items1) {
dlm.addElement(temp);//向数据模型中添加元素
}
dlm.addElement("新元素");//数据模型调用addElement方法就可以在数据模型中添加新的元素
JList<String> jl = new JList<>();
jl.setModel(dlm);
/*
* SINGLE_SELECTION:单选
* SINGLE_INTERVAL_SELECTION:只能连续选择相邻的元素
* MULTIPLE_INTERVAL_SELECTION:不限定选择模式
* */
jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);//设置选择模式
JScrollPane jsp = new JScrollPane(jl);//创建滚动面板,向滚动面板中添加列表框
jsp.setBounds(10, 10, 100, 300);//设置滚动面板的坐标和大小
container.add(jsp);//将滚动面板添加到容器中
/*获取列表框中选中的数据*/
JButton button = new JButton("确认");
button.setBounds(130, 10, 80, 50);
button.addActionListener(new ActionListener() {//为按钮添加时间监听
public void actionPerformed(ActionEvent e) {
List<String> list = jl.getSelectedValuesList();
for (String temp : list) {
System.out.println("选中的数据:"+temp);
}
System.out.println("-----end--------");
}
});
container.add(button);
this.setVisible(true);
}
public static void main(String[] args) {
new J_list();
}
}
8.文本框组件
package com.Adder;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JText_Field extends JFrame {
public JText_Field(){
this.setBounds(500,500,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container=this.getContentPane();
container.setLayout(new FlowLayout());
JTextField textField =new JTextField();
textField.setColumns(20);//设置文本框的长度,长度为20个字符
textField.setText("初始值1");//设置文本
textField.setFont(new Font("楷体",Font.PLAIN,20));//设置字体格式:字体为楷体、字体的样式为普通样式、字号为20
container.add(textField);
JButton button=new JButton("获取文本框中的内容");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("文本框中的内容为: "+textField.getText());//获取文本框中的内容
textField.setText("");//清空文本框中的内容
textField.requestFocus();//获取焦点(光标)
}
});
container.add(button);
this.setVisible(true);
}
public static void main(String[] args) {
new JText_Field();
}
}
9.密码框组件
package com.Adder;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JPassword_field extends JFrame {
public JPassword_field(){
this.setBounds(200,200,500,500);
Container container=this.getContentPane();
container.setLayout(new FlowLayout());
JPasswordField passwordField=new JPasswordField();
passwordField.setColumns(20);//设置密码框可以显示20个字符
//passwordField.setFont(new Font("密码",Font.BOLD,18));//设置字体
passwordField.setEchoChar('#');//设置回显字符
passwordField.addActionListener(new ActionListener() {//单击回车,获取密码
public void actionPerformed(ActionEvent e) {
char[] password=passwordField.getPassword();
String str=new String(password);
System.out.println(str);
}
});
container.add(passwordField);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JPassword_field();
}
}
10.文本域组件
package com.Adder;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JText_Area extends JFrame {
public JText_Area(){
this.setBounds(200,200,500,500);
Container container=this.getContentPane();
container.setLayout(new FlowLayout());
JTextArea area =new JTextArea();//获取文本域对象
area.setRows(5);//设置文本域行数(宽)
area.setColumns(10);//设置文本域列数(长)
area.setFont(new Font("楷体",Font.PLAIN,20));//设置文本域中文字的格式
area.setText("文本域初始文本内容");
JButton button=new JButton("文本框内容");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {//获取文本域中的内容
System.out.println("文本域中的内容: "+area.getText());
}
});
container.add(button);
JScrollPane jsp=new JScrollPane(area);//给文本域添加滚动条
container.add(jsp);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JText_Area();
}
}