文章目录
Swing特点
Swing是一个用于开发桌面图形用户界面应用程序的JAVA包,是基于AWT开发的,故AWT是Swing的基础,AWT的全称为抽象窗口工具包(Abstract Window Toolkit,是java开发用户界面程序的基本工具包,Swing提供了大量的轻量组件的组件集,其中一部分是AWT所缺少的,即为Swing的附加组件,还有一部分是由Swing提供的用来替代AWT重量组件的轻量组件。此外,因为Swing还提供了一个用于实现包含插入式界面样式等特性的图形用户界面的下层组件,使得Swing组件在不同的平台上都能够保持组件的界面样式特性。
窗体组件类结构
常用Swing组件
- JFrame 窗体
- JDialog 对话框
- JPanel 面板
- JButton 按钮
- JLabel 标签
- JCheakBox 多选按钮
- JRadioButton 单选按钮
- JTextField 文本框
- JPassword 密码框
- JComBox 下拉框
- JTextArea 文本域
- JList 列表框
- JOptionPane 小对话框
下面,就来对这些组件做详细的介绍,当然,主要以代码来做进一步说明。
窗体 JFrame
窗体,作为组件的载体,是展现组件的根本,也可以说是最外层的容器。
import java.awt.*;
import javax.swing.*;
public class Demo
{
public static void main(String[] args)
{
JFrame f = new JFrame("窗体标题");//创建窗体对象并设置标题
f.setVisible(true);//设置窗体可见
/*
* 窗体关闭规则:
* EXIT_ON_CLOSE 隐藏窗体,并停止程序
* DO_NOTHING_ON_CLOSE 无任何操作
* HIDE_ON_CLOSE 隐藏窗体,但不停止程序
* DISPOSE_ON_CLOSE 释放窗体资源
*/
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// f.setSize(300,200);//设置窗体的大小,单位是像素
// f.setLocation(200,200);//设置坐标,单位是像素
f.setBounds(200, 200, 300, 200);//设置窗体的坐标和大小,单位是像素
Container c = f.getContentPane();//获取窗体容器
c.setBackground(Color.WHITE);//设置背景颜色
JLabel l = new JLabel("这是一个窗体");
c.add(l);
// c.remove(l);//删除组件
c.validate();//验证容器中的组件,相当于刷新
// f.setContentPane(c);//重新载入容器
f.setResizable(false);//设置窗体是否可以改变大小
System.out.println("x="+f.getX()+" y="+f.getY());//获取窗口坐标
/*
* 注意:在实际开发中,使目前所在类继承JFrame类,在构造方法中对窗口进行
* 初始化不必再创建窗体对象
*/
}
}
JDialog 对话框
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Demo1 extends JDialog {
public Demo1(JFrame frame)
{
//阻塞
/*第一个参数 父窗体对象
* 第二个参数 对话框标题
* 第三个参数 是否可以堵塞
*/
super(frame, "对话框标题", true);
Container c = getContentPane();//获取窗体容器
c.add(new JLabel("这是一个对话框"));
// setVisible(true);//设置窗体可见
setBounds(200, 200, 300, 200);//设置窗体坐标和大小
}
public static void main(String[] args)
{
JFrame f = new JFrame("父窗口");
f.setBounds(50, 50, 200, 200);
Container c = f.getContentPane();
JButton btn = new JButton("弹出对话框");
c.setLayout(new FlowLayout());//设置布局,使用流布局
c.add(btn);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn.addActionListener(new ActionListener() {//添加监听
public void actionPerformed(ActionEvent e) {
Demo1 d = new Demo1(f);
d.setVisible(true);
}
});
c.validate();
}
}
JLabel 标签
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import javax.swing.*;
public class Demo2 extends JFrame
{
public Demo2()
{
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
setVisible(true);
JLabel l = new JLabel("这是一个标签");
// l.setText("更改标签内容");
// System.out.println(l.getText());
/*
* 更改字体样式
* 第一个参数为字体类型
* 第二个参数为字体格式
* 第三个参数为字体大小
*/
l.setFont(new Font("楷体",Font.BOLD,15));
l.setForeground(Color.RED); //更改字体颜色
c.add(l);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Demo2();
}
}
图片的使用
import java.awt.Container;
import java.awt.Image;
import java.net.URL;
import javax.swing.*;
public class Demo3 extends JFrame
{
public Demo3()
{
setBounds(200, 200, 300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
Container c = getContentPane();
JLabel l = new JLabel("这是一个展示图片的标签");
//方法一
// URL url = Demo3.class.getResource("java.png");//获取图片URL路径
// System.out.println(url);
// Icon icon = new ImageIcon(url);//获取相应路径下的图片文件
//方法二
Icon icon = new ImageIcon("src/bilibili/java.png");
l.setIcon(icon);//添加图片
l.setSize(20, 20);//设置标签大小,即使设置标签大小,也不会改变图片大小
c.add(l);
setVisible(true);
}
public static void main(String[] args)
{
new Demo3();
}
}
绝对布局
硬性决定组件在窗体中的位置及大小,也叫null布局
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Demo4 extends JFrame{
public Demo4()
{
setBounds(100, 100, 200, 150);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c =getContentPane();
c.setLayout(null);;//将容器的布局设置为绝对布局
JButton b1 =new JButton("按钮一");
JButton b2 = new JButton("按钮二");
b1.setBounds(10, 30, 80, 30);//设置按钮在容器中的坐标和大小
b2.setBounds(120, 30, 80, 30);
c.add(b1);
c.add(b2);
setVisible(true);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Demo4();
}
}
流布局
从左到右排列,默认居中对齐
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.*;
public class Demo5 extends JFrame
{
public Demo5()
{
setTitle("窗口标题");
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
/*
* 参数一:对齐方式
* 参数二:水平间距
* 参数三:垂直间距
*/
c.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));//给容器设置为流布局
for(int i=0;i<10;i++)
{
c.add(new JButton("按钮"+i));
}
setVisible(true);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Demo5();
}
}
边界布局 BorderLayout
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.*;
public class Demo6 extends JFrame
{
public Demo6()
{
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c =getContentPane();
c.setLayout(new BorderLayout());//设置为边界布局,默认为边界布局
JButton b1 = new JButton("中");
JButton b2 = new JButton("东");
JButton b3 = new JButton("西");
JButton b4 = new JButton("南");
JButton b5 = new JButton("北");
c.add(b1,BorderLayout.CENTER);
c.add(b2, BorderLayout.EAST);
c.add(b3, BorderLayout.WEST);
c.add(b4,BorderLayout.SOUTH);
c.add(b5, BorderLayout.NORTH);
c.add(new JButton("新组件覆盖旧组件"));
setVisible(true);
}
public static void main(String[] args)
{
new Demo6();
}
}
网格布局
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.*;
public class Demo7 extends JFrame
{
public Demo7()
{
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
/*
* 设置为网格布局,设置为7行三列,水平间距为5像素,垂直间距为10像素
*/
c.setLayout(new GridLayout(7,3,5,10));
for(int i=0;i<20;i++)
{
c.add(new JButton("按钮"+i));
}
setVisible(true);
}
public static void main(String[] args)
{
// TODO 自动生成的方法存根
new Demo7();
}
}
网格组布局管理器
import java.awt.*;
import javax.swing.*;
public class Demo9 {
JFrame f =new JFrame();
Container c =f.getContentPane();
void creatFrame()
{
// 先设置大小,在居中
f.setSize(800,600);
f.setLocationRelativeTo(null); //居中
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
c.setLayout(new GridBagLayout());
}
//gridx gridy
void init()
{
//默认为边界布局
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 0;
g1.gridy = 0;
c.add(new JButton("组件一"),g1);
GridBagConstraints g2 = new GridBagConstraints();
g2.gridx = 1;
g2.gridy = 1;
c.add(new JButton("组件二"),g2);
GridBagConstraints g3 = new GridBagConstraints();
g3.gridx = 2;
g3.gridy = 2;
c.add(new JButton("组件三"),g3);
}
void creatButton()
{
for(int i=0;i<9;i++)
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = i;
g1.gridy = 0;
c.add(new JButton("组件"),g1);
GridBagConstraints g2 = new GridBagConstraints();
g2.gridx = 0;
g2.gridy = i;
c.add(new JButton("组件"),g2);
}
}
void init2()
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 1;
g1.gridy = 1;
c.add(new JButton("组件"),g1);
GridBagConstraints g2 = new GridBagConstraints();
g2.gridx = 2;
g2.gridy = 2;
g2.gridwidth = 2;
g2.gridheight = 1;
c.add(new JButton("组件"),g2);
GridBagConstraints g3 = new GridBagConstraints();
g3.gridx = 4;
g3.gridy = 4;
g3.gridwidth = 2;
g3.gridheight = 2;
c.add(new JButton("组件"),g3);
}
void init3()
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 1;
g1.gridy = 1;
g1.gridwidth = 2;
g1.gridheight = 2;
c.add(new JButton("none"),g1);
GridBagConstraints g2 = new GridBagConstraints();
g2.gridx = 3;
g2.gridy = 1;
g2.gridwidth = 2;
g2.gridheight = 2;
g2.fill = GridBagConstraints.HORIZONTAL;//水平填充
c.add(new JButton("HORIZONTAL"),g2);
GridBagConstraints g3 = new GridBagConstraints();
g3.gridx = 5;
g3.gridy = 1;
g3.gridwidth = 2;
g3.gridheight = 2;
g3.fill = GridBagConstraints.VERTICAL;//垂直填充
c.add(new JButton("VERTICAL"),g3);
GridBagConstraints g4 = new GridBagConstraints();
g4.gridx = 7;
g4.gridy = 1;
g4.gridwidth = 2;
g4.gridheight = 2;
g4.fill = GridBagConstraints.BOTH;//全填充
c.add(new JButton("BOTH"),g4);
}
void init4()
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 1;
g1.gridy = 1;
g1.gridwidth = 2;
g1.gridheight = 2;
g1.anchor = GridBagConstraints.NORTH;
c.add(new JButton("@"),g1);
g1.fill = GridBagConstraints.BOTH;
g1.anchor = GridBagConstraints.CENTER;
JPanel p =new JPanel();
p.setBackground(Color.BLUE);
c.add(p,g1);
}
void init5()
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 1;
g1.gridy = 1;
g1.gridwidth = 2;
g1.gridheight = 2;
g1.insets = new Insets(0, 0, 0, 0);
c.add(new JButton("组件"),g1);
g1.fill = GridBagConstraints.BOTH;
g1.anchor = GridBagConstraints.CENTER;
JPanel p =new JPanel();
p.setBackground(Color.BLUE);
c.add(p,g1);
}
void init6()
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 2;
g1.gridy = 2;
g1.ipadx = 10;
g1.ipady = 10;
c.add(new JButton("组件"),g1);
GridBagConstraints g2 = new GridBagConstraints();
g2.gridx = 4;
g2.gridy = 2;
g2.ipadx = -10;
g2.ipady = -10;
c.add(new JButton("组件"),g2);
}
void init7()
{
GridBagConstraints g1 = new GridBagConstraints();
g1.gridx = 2;
g1.gridy = 2;
g1.weightx = 10;
g1.weighty = 10;
c.add(new JButton("组件"),g1);
}
public static void main(String[] args)
{
// TODO 自动生成的方法存根
Demo9 d =new Demo9();
d.creatFrame();
// d.init();
d.creatButton();
// d.init2();
// d.init3();
// d.init4();
// d.init5();
// d.init6();
d.init7();
d.f.setVisible(true);
}
}
下拉框
import java.awt.*;
import javax.swing.*;
public class Demo11 extends JFrame{
public Demo11()
{
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);//null 为绝对布局
// JButton btn = new JButton("null布局");
// btn.setBounds(0,0,88,88);
// c.add(btn);
// JButton btn = new JButton("默认布局");
// btn.setBounds(0, 0, 88, 88);
// c.add(btn);
String[] items = {"元素1","元素2","元素3","元素4","元素5","元素6","元素7"};
//方法一
// JList<String> list = new JList<String>(items);
//方法二
DefaultListModel<String> model = new DefaultListModel<String>();
for(String tmp : items)
{
model.addElement(tmp);
}
JList<String> j1 = new JList<String>();
model.addElement("添加元素");
j1.setModel(model);
//选择模式
/*SINGLE_SELECTION 单选
* SINGLE_INTERVAL_SELECTION 只能连续选择相邻的元素
* MULTIPLE_INTERVAL_SELECTION 随便选
*/
j1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//创建滚动面板
JScrollPane jsp = new JScrollPane(j1);//为列表框添加滚动面板
jsp.setBounds(10, 10, 100, 100);
c.add(jsp);
JButton btn = new JButton("确认");
btn.setBounds(120, 90, 70, 25);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
//获取列表框中选中的所有元素
java.util.List<String> value = j1.getSelectedValuesList();
for(String str: value)
{
System.out.println(str);
}
System.out.println("------------------------");
}
});
c.add(btn);
setVisible(true);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Demo11();
}
文本框
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Demo12 extends JFrame
{
public Demo12()
{
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());//null 为绝对布局
JTextField jt = new JTextField("aaa");//初始值
jt.setColumns(20);//设置文本框的长度为20
jt.setText("aaa");//设置文本
jt.setFont(new Font("黑体",Font.BOLD,20));//设置字体格式
JButton btn = new JButton("按钮");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
System.out.println("文本框中的值为:"+jt.getText());//获取文本框中的文本值
jt.setText("");//清空文本框中的内容
jt.requestFocus();//获取焦点 获取光标
}
});
btn.setBounds(100, 100, 50, 50);
c.add(btn);
c.add(jt);
setVisible(true);
}
public static void main(String[] args)
{
// TODO 自动生成的方法存根
new Demo12();
}
}
密码框
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Demo13 extends JFrame
{
public Demo13()
{
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());//null 为绝对布局
JPasswordField jps = new JPasswordField();
jps.setColumns(20);//设置密码框长度显示20字符
jps.setFont(new Font("黑体",Font.BOLD,18));
jps.setEchoChar('*');//设置回显字符
c.add(jps);
jps.addActionListener(new ActionListener() {
@Override
//回车动作监听
public void actionPerformed(ActionEvent arg0) {
// TODO 自动生成的方法存根
char[] ch = jps.getPassword();
String str = new String(ch);
System.out.println("密码为:"+str);//获取密码的字符数组
}
});
setVisible(true);
}
public static void main(String[] args)
{
new Demo13();
}
}
文本域
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.*;
public class Demo14 extends JFrame
{
public Demo14()
{
setBounds(300, 300, 400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JTextArea area = new JTextArea();
area.setText("设置文本内容");
area.setRows(5);//设定行
area.setColumns(10);//设定列数
// area.setText("添加内容");
area.append("添加内容");
area.insert("插入内容", 2);//在第二个字符后面插入内容
area.setFont(new Font("黑体",Font.BOLD,20));
JScrollPane js = new JScrollPane(area);//给文本域添加滚动条
c.add(js);
setVisible(true);
}
public static void main(String[] args)
{
new Demo14();
}
}
动作事件监听器
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Demo15 extends JFrame
{
public Demo15()
{
setBounds(100, 100, 500, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
JPanel centerP = new JPanel();
centerP.setLayout(new FlowLayout());
c.add(centerP,BorderLayout.CENTER);
JPanel southP = new JPanel();
JLabel console = new JLabel("点击组件");
southP.add(console);
c.add(southP,BorderLayout.SOUTH);
JButton btn = new JButton("按钮");
centerP.add(btn);
btn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
console.setText("您点击了按钮");
}
});
JTextField jt = new JTextField(10);
centerP.add(jt);
jt.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
JTextField jtTmp = (JTextField)obj;
System.out.println(jtTmp.getText());
console.setText(jt.getText());
}
});
JCheckBox jc = new JCheckBox("多选框");
centerP.add(jc);
jc.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
console.setText("多选框被点击");
}
});
JRadioButton jr = new JRadioButton("单选框");
centerP.add(jr);
jr.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
console.setText("单选框被点击");
}
});
String values[] = {"选项一","选项二","选项三"};
JComboBox<String> jb = new JComboBox<String>(values);
centerP.add(jb);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
console.setText("下拉列表被选择");
}
});
setVisible(true);
c.validate();
}
public static void main(String[] args)
{
new Demo15();
}
}
焦点监听器
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.security.GeneralSecurityException;
import javax.swing.*;
import javax.swing.border.Border;
public class Demo16 extends JFrame{
public Demo16()
{
setTitle("这是一个窗口");
setBounds(300,300,500,300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
setContentPane(contentPane);
contentPane.setLayout(null);
JTextField jt1 = new JTextField(10);//显示10个字符
jt1.setBounds(10, 10, 66, 21);
contentPane.add(jt1);
JTextField jt2 = new JTextField(10);//显示10个字符
jt2.setBounds(10, 41, 66, 21);
contentPane.add(jt2);
JTextField jt3 = new JTextField(10);//显示10个字符
jt3.setBounds(10, 72, 66, 21);
contentPane.add(jt3);
JLabel lb1 = new JLabel();
lb1.setBounds(86, 10, 66, 21);
lb1.setText("未获取焦点");
contentPane.add(lb1);
JLabel lb2 = new JLabel();
lb2.setBounds(86, 41, 66, 21);
lb2.setText("未获取焦点");
contentPane.add(lb2);
JLabel lb3 = new JLabel();
lb3.setBounds(86, 72, 66, 21);
lb3.setText("未获取焦点");
contentPane.add(lb3);
//添加焦点监听事件
/* jt1.addFocusListener(new FocusListener()
{
public void focusLost(FocusEvent arg0) {
// TODO 自动生成的方法存根
lb1.setText("失去焦点");
lb1.setForeground(Color.RED);
}
public void focusGained(FocusEvent arg0) {
// TODO 自动生成的方法存根
lb1.setText("");
}
});
jt2.addFocusListener(new FocusListener()
{
public void focusLost(FocusEvent arg0) {
// TODO 自动生成的方法存根
lb2.setText("失去焦点");
lb2.setForeground(Color.RED);
}
public void focusGained(FocusEvent arg0) {
// TODO 自动生成的方法存根
lb2.setText("");
}
});
jt3.addFocusListener(new FocusListener()
{
public void focusLost(FocusEvent arg0) {
// TODO 自动生成的方法存根
lb3.setText("失去焦点");
lb3.setForeground(Color.RED);
}
public void focusGained(FocusEvent arg0) {
// TODO 自动生成的方法存根
lb3.setText("");
}
});
*/
// jt1.addFocusListener(new MyfocutListener());//使用自定义的监听实现类
// jt2.addFocusListener(new MyfocutListener());//使用自定义的监听实现类
// jt3.addFocusListener(new MyfocutListener());//使用自定义的监听实现类
setVisible(true);
}
class MyfocutListener implements FocusListener//自定义焦点事件监听
{
public void focusGained(FocusEvent e)
{
JTextField tmp = (JTextField)e.getSource();//获取触发事件的组件
tmp.setBorder(BorderFactory.createLineBorder(Color.GREEN));//给获取焦点的边框设置绿色边框
}
public void focusLost(FocusEvent e)
{
JTextField tmp = (JTextField)e.getSource();//获取触发事件的组件
tmp.setBorder(BorderFactory.createLineBorder(Color.RED));//给获取焦点的边框设置红色边框
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Demo16();
}
}
对于表格组件,参考添加链接描述