简介

  • AWT(译:抽象窗口工具包),是Java的平台独立的窗口系统,图形和用户界面器件工具包。
  • Swing 是为了解决 AWT 存在的问题而以 AWT 为基础新开发的包(在使用Swing时也常会用到java.awt.*包)。

JFrame

JFrame容器允许程序员把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。我们可以直接new一个JFrame对象,也可以自己实现一个类继承它(常用)。

常用方法

  • 设置窗口可见:setVisible(true);//默认为false
  • 设置窗口标题;setTitle(String title)
  • 设置点击窗口的×后执行的操作:setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

各参数定义:

EXIT_ON_CLOSE 隐藏窗口,并退出程序
DO_NOTHING_ON_CLOSE 无任何操作
HIDE_ON_CLOSE 隐藏窗体,但不停止程序
DISPOSE_ON_CLOSE 释放窗体资源

  • 设置窗体的大小(单位:像素):setSize(int width, int height);
  • 设置窗体坐标(单位:像素):setLocation(int x, int y);
  • 坐标大小一起设置:setBounds(int x, int y, int width, int height);
  • 获取窗口坐标:横坐标:getX();纵坐标:getY()
  • 获取窗口大小:宽:getWidth();高:getHeight()
  • 获取窗口容器:Container contentPane = getContentPane();

设置背景:contentPane.setBackground(Color.GREEN)

添加组件:contentPane.add(Component comp)

验证容器中的组件(相当于刷新):contentPane.validate()

重新载入容器可实现刷新效果:setContentPane(contentPane) //一般使用validate()

设置布局:contentPane.setLayout(LayoutManager mgr);

 常见组件

按钮:JButton

复选框组件:JCheckbox

下拉列表框:JCombox

标签组件:JLabel

单选按钮:JRadioButton

框列表框:JList

文本框:JTextField

密码框:JPasswordField

文本域:JTextArea

对话框:JOptionPane

代码示例

JDialog对话框

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; /**
* 对话框
*/
public class Demo02 extends JDialog { public Demo02(JFrame jFrame) {
/**
* 父窗体对象,对话框标题, 是否阻塞父窗体(只能弹出一个对话框,弹出后不能点击父窗体)
*/
super(jFrame, "对话框标题", true);
Container contentPane = getContentPane();
contentPane.add(new JLabel("这是一个对话框"));
setBounds(300, 300, 300, 300);
} public static void main(String[] args) {
JFrame jFrame = new JFrame("父窗体");
jFrame.setBounds(200,200,500,500);
Container contentPane = jFrame.getContentPane();
JButton button = new JButton("弹出对话框");
//设置布局,使用流布局
contentPane.setLayout(new FlowLayout());
contentPane.add(button);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // button.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// Demo02 demo02 = new Demo02(jFrame);
// //设置对话框可见
// demo02.setVisible(true);
// }
// }); //Lambda 表达式
button.addActionListener((e)->{
Demo02 demo02 = new Demo02(jFrame);
//设置对话框可见
demo02.setVisible(true);
}); }
}

使用JLabel标签添加图片

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.net.URL; /**
* 使用JLabel标签添加图片
*/
public class Demo03 extends JFrame {
public Demo03(){
setTitle("显示图片窗口");
setVisible(true);
setBounds(300, 300, 400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane(); contentPane.setBackground(Color.cyan); JLabel jLabel = new JLabel();
// URL url = Demo03.class.getResource("/picture.jpg");
// //获取相应路径下的图片
// Icon icon = new ImageIcon(url); ImageIcon icon = new ImageIcon("src/picture.jpg");
System.out.println(icon.getIconHeight()+"#"+icon.getIconWidth());
//使图片适应窗口
icon.setImage(icon.getImage().getScaledInstance(getWidth(), getHeight(), Image.SCALE_DEFAULT));
//添加图片
jLabel.setIcon(icon);
// 即使设置标签大小,也不会改变图片大小
// jLabel.setSize(20, 20); System.out.println(icon.getIconHeight()+"#"+icon.getIconWidth()); contentPane.add(jLabel);
//刷新
contentPane.validate();
} public static void main(String[] args) {
new Demo03();
}
}

设置布局

 package com.czm;

 import javax.swing.*;
import java.awt.*; /**
* 设置布局
*/
public class Demo04 extends JFrame { public Demo04(){
setTitle("布局");
setBounds(300, 300, 400, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane();
/**
* 绝对布局(参数为null时为绝对布局),即各组件位置按像素设定
* 各组件位置大小不会随窗口改变而该变
*
contentPane.setLayout(null);
JButton bb = new JButton("按钮1");
JButton bb2 = new JButton("按钮2");
// 设置组件在窗体位置及大小(不设置无法显示)
bb.setBounds(10, 10,100,100);
bb2.setBounds(200, 200,100,100);
contentPane.add(bb);
contentPane.add(bb2);
*/
/**
* 设置布局,不设置默认边界布局
* 使用流布局(组件会随窗体大小而改变),不传参数默认居中对齐,
* 参数:对齐方式、水平间距、垂直间距
* contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 30));
for (int i = 0; i < 10; i++){
contentPane.add(new JButton("b"+i));
}
*/
/**
//使用边界布局
contentPane.setLayout(new BorderLayout());
JButton b1 = new JButton("中"),
b2 = new JButton("东"),
b3 = new JButton("西"),
b4 = new JButton("南"),
b5 = new JButton("北");
//中部添加(不指明方位默认为中部)
contentPane.add(b1, BorderLayout.CENTER);
//东部
contentPane.add(b2, BorderLayout.EAST);
//西部
contentPane.add(b3, BorderLayout.WEST);
//南部
contentPane.add(b4, BorderLayout.SOUTH);
//北部
contentPane.add(b5, BorderLayout.NORTH);
//新组件会覆盖旧组件
contentPane.add(new JButton("覆盖"), BorderLayout.NORTH); */ /**
* 网格布局GridLayout(行数, 列数,列距,行距)(列距,行距可省略,默认为0) contentPane.setLayout(new GridLayout(4, 5,5,10));
for (int i=0; i < 20; i++){
contentPane.add(new JButton("按钮"+i));
}
//超过规格会自动扩充适应
contentPane.add(new JButton("超过的按钮"));
*/ //刷新
contentPane.validate();
} public static void main(String[] args) {
new Demo04();
}
}

网格组布局管理

 package com.czm;

 import javax.swing.*;
import java.awt.*; /**
* 网格组布局管理
*/
public class Demo05 {
JFrame jFrame = new JFrame();
Container container;
void createFrame(){
//设置网格组布局
container = jFrame.getContentPane();
container.setLayout(new GridBagLayout());
jFrame.setSize(800, 600);
//先设置大小再设置默认居中
// jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
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;
g2.gridy = 1;
container.add(new JButton("组件2"), g2);
GridBagConstraints g3 = new GridBagConstraints();
//第四行第四列(由于第三行第三列没组件,自动补齐)
g3.gridx = 3;
g3.gridy = 3;
container.add(new JButton("组件3"), g3);
} void init2(){
//创建约束条件
GridBagConstraints g1 = new GridBagConstraints();
//第一行第一列
g1.gridx = 1;
g1.gridy = 1;
//宽高各占一格
g1.gridwidth = 1;
g1.gridheight = 1;
container.add(new JButton("none"), g1);
GridBagConstraints g2 = new GridBagConstraints();
//第二行第二列
g2.gridx = 2;
g2.gridy = 1;
g2.gridwidth = 2;
g2.gridheight = 1;
//水平填充
g2.fill = GridBagConstraints.HORIZONTAL;
container.add(new JButton("HORIZONTAL"), g2);
GridBagConstraints g3 = new GridBagConstraints();
//第四行第四列(由于第三行第三列没组件,自动补齐)
g3.gridx = 4;
g3.gridy = 1;
g3.gridwidth = 2;
g3.gridheight = 2;
//垂直填充
g3.fill = GridBagConstraints.VERTICAL;
container.add(new JButton("VERTICAL"), g3);
GridBagConstraints g4 = new GridBagConstraints();
//第四行第四列(由于第三行第三列没组件,自动补齐)
g4.gridx = 6;
g4.gridy = 1;
g4.gridwidth = 2;
g4.gridheight = 2;
//全填充
g4.fill = GridBagConstraints.BOTH;
container.add(new JButton("BOTH"), g4);
} /**
* anchor属性(确定方位,默认CENTER居中)
*/
void init3(){
//创建约束条件
GridBagConstraints g1 = new GridBagConstraints();
//第一行第一列
g1.gridx = 1;
g1.gridy = 1;
g1.gridheight = 2;
g1.gridwidth = 2;
g1.anchor = GridBagConstraints.NORTHEAST;
container.add(new JButton("@"), g1);
//创建面板
// g1.anchor = GridBagConstraints.CENTER;
g1.fill = GridBagConstraints.BOTH;
JPanel jPanel = new JPanel();
jPanel.setBackground(Color.green);
container.add(jPanel, g1);
} /**
* insert自定义位置
*/
void init4(){
//创建约束条件
GridBagConstraints g1 = new GridBagConstraints();
//第一行第一列
g1.gridx = 1;
g1.gridy = 1;
g1.insets = new Insets(5,5,5,10);
container.add(new JButton("@"), g1); }
/**
* ipadx和ipady组件的首选大小(正数放大,负数缩小)
*/
void init5(){
//创建约束条件
GridBagConstraints g1 = new GridBagConstraints();
//第一行第一列
g1.gridx = 1;
g1.gridy = 1;
g1.ipadx = 100;
g1.ipady = 10;
container.add(new JButton("@"), g1); GridBagConstraints g2 = new GridBagConstraints();
g2.gridx = 4;
g2.gridy = 2;
g2.ipadx = -10;
g2.ipady = -10;
container.add(new JButton("@"), g2); } /**
* weightx,weighty用来设置窗口变大时,各组件跟着变大的比例
* 窗体放大时组件2的x轴放大倍速是组件1的10倍
*/
void init6(){
//创建约束条件
GridBagConstraints g1 = new GridBagConstraints();
//第一行第一列
g1.gridx = 1;
g1.gridy = 1;
g1.weightx = 0.1;
g1.weighty = 0.5;
container.add(new JButton("组件1"), g1); GridBagConstraints g2 = new GridBagConstraints();
//第一行第一列
g2.gridx = 2;
g2.gridy = 1;
g2.weightx = 1;
g2.weighty = 0.5;
container.add(new JButton("组件2"), g2); }
void createButton(){
for (int i=0; i<10; i++){
GridBagConstraints gg = new GridBagConstraints();
gg.gridx = i;
gg.gridy = 0;
container.add(new JButton("网格"), gg);
}
for (int i=0; i<10; i++){
GridBagConstraints gg2 = new GridBagConstraints();
gg2.gridx = 0;
gg2.gridy = i;
container.add(new JButton("网格"), gg2);
} }
public static void main(String[] args) {
Demo05 demo05 = new Demo05();
demo05.createFrame();
demo05.createButton();
demo05.init6();
demo05.jFrame.setVisible(true);
}
}

下拉列表(JComboBox)

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; /**
* 下拉列表(JComboBox)
*/
public class Demo06 extends JFrame {
public Demo06(){
setBounds(200,200, 400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane();
contentPane.setLayout(null); //下拉框
//向下拉框添加选项一
// JComboBox<String> jComboBox = new JComboBox<>();
// jComboBox.addItem("苹果");
// jComboBox.addItem("荔枝");
// jComboBox.addItem("桃");
//向下拉框添加选项二(用String数组)
// String items[] = new String[]{"苹果","荔枝","芒果"};
// JComboBox<String> jComboBox = new JComboBox<>(items); //向下拉框添加选项三(下拉列表模型)
JComboBox<String> jComboBox = new JComboBox<>();
String items[] = new String[]{"苹果","荔枝","芒果"};
ComboBoxModel<String> comboBoxModel = new DefaultComboBoxModel<>(items);
jComboBox.setModel(comboBoxModel);
//设置是否可输入(默认false)输入后获取的下标为-1
jComboBox.setEditable(true); jComboBox.setBounds(100, 100, 100, 30); JButton jButton = new JButton("打印");
jButton.setBounds(200, 100, 100, 30);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("选中项下标:"+jComboBox.getSelectedIndex());
System.out.println("选中项:"+jComboBox.getSelectedItem());
}
}); contentPane.add(jButton);
contentPane.add(jComboBox);
setVisible(true);
} public static void main(String[] args) {
new Demo06();
}
}

列表框JList

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List; /**
* 列表框JList
*/
public class Demo07 extends JFrame {
public Demo07(){
setBounds(200,200, 400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(null); String[] items = new String[]{"a", "b", "c", "d", "e", "f", "g"};
//创建列表数据的模型
DefaultListModel<String> defaultListModel = new DefaultListModel<>();
for (String tem: items){
//向列表模型添加元素
defaultListModel.addElement(tem);
}
//列表
JList<String> jList = new JList<>();
jList.setModel(defaultListModel); /**
* 设置选择模式
* MULTIPLE_INTERVAL_SELECTION:(默认)随便选
* SINGLE_INTERVAL_SELECTION:只能选择相邻的元素
* SINGLE_SELECTION:单选
*/
jList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); //创建滚动条并添加列表
JScrollPane jScrollPane = new JScrollPane(jList);
jScrollPane.setBounds(100, 100, 100, 100); //使用模型可随时添加元素
defaultListModel.addElement("添加元素"); contentPane.add(jScrollPane);
setVisible(true); JButton jButton = new JButton("打印");
jButton.setBounds(200,100,100,30);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
List<String> selectedValuesList = jList.getSelectedValuesList();
for (String tmp: selectedValuesList){
System.out.println(tmp);
}
System.out.println("_______end________");
}
}); contentPane.add(jButton);
} public static void main(String[] args) {
new Demo07();
}
}

文本框JTextField

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; /**
* 文本框JTextField
*/
public class Demo08 extends JFrame {
public Demo08(){
setBounds(100, 100, 400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout()); //创建文本框
JTextField jTextField = new JTextField();
//设置文本框长度(单位字符)
jTextField.setColumns(20);
//设置初始值
jTextField.setText("初始值");
//设置字体格式
jTextField.setFont(new Font("黑体", Font.PLAIN,20)); contentPane.add(jTextField); JButton jButton = new JButton("确认");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("文本框的内容:"+jTextField.getText());
//清空文本框
jTextField.setText("");
//获取焦点
jTextField.requestFocus();
}
}); contentPane.add(jButton);
setVisible(true);
} public static void main(String[] args) {
new Demo08();
}
}

密码框

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; /**
* 密码框
*/
public class Demo09 extends JFrame {
public Demo09(){
setBounds(200, 200, 400, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout()); //创建密码框组件
JPasswordField jPasswordField = new JPasswordField();
//设置密码框长度,20个字符
jPasswordField.setColumns(20); //设置回显字符(屏幕上看到我们输入的字符)
jPasswordField.setEchoChar('#');
//设置字体
jPasswordField.setFont(new Font("黑体", Font.BOLD, 18)); //添加监听(回车时触发)
jPasswordField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
char[] password = jPasswordField.getPassword();
System.out.println(new String(password));
}
}); contentPane.add(jPasswordField); setVisible(true); } public static void main(String[] args) {
new Demo09();
}
}

文本域

 package com.czm;

 import javax.swing.*;
import java.awt.*; /**
* 文本域
*/
public class Demo10 extends JFrame {
public Demo10(){
setBounds(200, 200, 400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout()); //创建文本域
JTextArea jTextArea = new JTextArea();
//设定文本内容
jTextArea.setText("初始内容");
//设定行
jTextArea.setRows(5);
//设定列数
jTextArea.setColumns(20);
//添加内容
jTextArea.append("添加内容");
//在第二个字符后面插入内容
jTextArea.insert("【插入内容】", 2);
//给文本域添加滚动条
JScrollPane jScrollPane = new JScrollPane(jTextArea);
contentPane.add(jScrollPane);
setVisible(true);
} public static void main(String[] args) {
new Demo10();
}
}

事件监听

 package com.czm;

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener; /**
* 事件监听
*/
public class Demo11 extends JFrame {
public Demo11(){
setBounds(200, 200, 400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout()); JLabel jLabel = new JLabel("标签");
JButton jButton = new JButton("按钮");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jLabel.setText("按钮被点击");
}
}); JTextField jTextField = new JTextField();
//设置文本框长度(单位字符)
jTextField.setColumns(20);
//设置初始值
jTextField.setText("初始值");
//设置字体格式
jTextField.setFont(new Font("黑体", Font.PLAIN,20)); jTextField.addFocusListener(new MyFocusListenter()); // jTextField.addFocusListener(new FocusListener() {
// @Override
// public void focusGained(FocusEvent e) {
//
// }
//
// @Override
// public void focusLost(FocusEvent e) {
//
// }
// }); contentPane.add(jTextField);
contentPane.add(jLabel);
contentPane.add(jButton);
setVisible(true);
} //实现焦点事件监听器
class MyFocusListenter implements FocusListener{
//获取焦点
@Override
public void focusGained(FocusEvent e) {
//获取触发事件的文本框
JTextField source = (JTextField) e.getSource();
//给获取焦点的文本框设置绿色边框
source.setBorder(BorderFactory.createLineBorder(Color.green));
source.setText("获得焦点");
} //离焦
@Override
public void focusLost(FocusEvent e) {
//获取触发事件的文本框
JTextField source = (JTextField) e.getSource();
//给失去焦点的文本框设置绿色边框
source.setBorder(BorderFactory.createLineBorder(Color.red));
source.setText("失去焦点");
}
}
public static void main(String[] args) {
new Demo11();
}
}

  

05-17 21:04