GUI 编程
1. 简介
Gui的核心技术:Swing AWT
-
了解MVC架构、监听!
2. AWT
-
包含了很多类和接口!GUI:图形化界面!
-
元素:创建,按钮,文本框
-
awt的包:java.awt

2.2 组件和容器
Frame
/GUI 的第一个界面
public class TestFrame {
public static void main(String[] args) {
//创建一个 Frame() 实例对象
//frame:框架 默认 false 不可见
Frame frame = new Frame("我的第一个GUI图形界面!");
//设置窗口可见性
frame.setVisible(true);
//窗口大小
frame.setSize(400,400);
//背景颜色
frame.setBackground(Color.CYAN);
//弹出位置
frame.setLocation(100,100);
//窗口大小不可变
frame.setResizable(false);
}
}
同时输出多个弹窗
package com.zhang.lesson01;
import java.awt.*;
public class TestFrame02 {
public static void main(String[] args) {
myFrame myFrame1 = new myFrame(200,200,200,200, Color.CYAN);
myFrame myFrame2 = new myFrame(400,200,200,200, Color.CYAN);
myFrame myFrame3 = new myFrame(200,400,200,200, Color.CYAN);
myFrame myFrame4 = new myFrame(400,400,200,200, Color.CYAN);
}
}
//封装类
class myFrame extends Frame {
static int id = 0;//用于计数
//使用构造方法,初始化即可加载数据
public myFrame(int x, int y, int w, int h, Color color) {
//显示窗口
setVisible(true);
//设置窗口大小以及显示位置
setBounds(x, y, w, h);
//窗口背景颜色
setBackground(color);
//窗口大小不可改变
setResizable(false);
}
}
2.3 Panel
解决关闭按钮事件
package com.zhang.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class testPanel {
public static void main(String[] args) {
//创建frame();对象 frame:框架
//创建Parme();对象 parme:面板
Frame frame = new Frame();
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//设置窗口大小
frame.setBounds(200,200,500,500);
//设置窗口背景
frame.setBackground(new Color(246, 246, 3));
//设置面板大小
panel.setBounds(100,100,300,300);
//设置面板背景
panel.setBackground(new Color(12, 12, 248));
//将面板添加到框架中 Component:成分
frame.add(panel);
//设置窗口的可见性
frame.setVisible(true);
//设置关闭弹窗的监听事件
//Listeners:侦听器
//使用适配器模式,只重写想要的方法
frame.addWindowListener(new WindowAdapter() {
//点击窗口的关闭事件
2.3. 布局管理器
-
流式布局
package com.zhang.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class test01 {
public static void main(String[] args) {
Frame frame = new Frame();
//设置组件
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
//设置为流程布局
//FlowLayout:流程布局
//默认剧中
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
frame.setSize(300,300);
//将按钮组件添加到窗口中
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.setVisible(true);
//监听窗口关闭事件;使用适配器
frame.addWindowListener(new WindowAdapter() {
//监听到弹窗的关闭事件
public void windowClosing(WindowEvent e) {
//执行关闭事件;强制关闭;结束程序
System.exit(0);
}
});
}
}
-
东西南北中
package com.zhang.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class DemoBorderLayout {
public static void main(String[] args) {
Frame frame = new Frame("Border Layout!");
Button east = new Button("East");
Button west = new Button("West");
Button south = new Button("South");
Button north = new Button("North");
Button center = new Button("Center");
//BorderLayout:边框布局
frame.add(east, BorderLayout.EAST);
frame.add(west, BorderLayout.WEST);
frame.add(south, BorderLayout.SOUTH);
frame.add(north, BorderLayout.NORTH);
frame.add(center, BorderLayout.CENTER);
frame.setSize(500,500);
frame.setVisible(true);
//事件监听器,弹窗关闭事件
frame.addWindowListener(new WindowAdapter() {
-
表格布局
package com.zhang.lesson01;
import java.awt.*;
public class DemoGripLayout {
public static void main(String[] args) {
Frame frame = new Frame("Border Layout!");
Button but1 = new Button("but1");
Button but2 = new Button("but2");
Button but3 = new Button("but3");
Button but4 = new Button("but4");
Button but5 = new Button("but5");
Button but6 = new Button("but6");
frame.setLayout(new GridLayout(2,3));
frame.add(but1);
frame.add(but2);
frame.add(but3);
frame.add(but4);
frame.add(but5);
frame.add(but6);
frame.setSize(200,200);
frame.setVisible(true);
}
}
练习:输出如下图形...
实现代码:
package com.zhang.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestEx {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setSize(400, 300);
frame.setLocation(400, 400);
frame.setBackground(Color.GREEN);
frame.setVisible(true);
frame.setLayout(new GridLayout(2, 1));
//面板
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new GridLayout(2, 1));
Panel p3 = new Panel(new BorderLayout());
Panel p4 = new Panel(new GridLayout(2, 2));
//上半部
p1.add(new Button("p1-EAST-01"), BorderLayout.EAST);
p1.add(new Button("p1-WEST-02"), BorderLayout.WEST);
p2.add(new Button("p2-but-01"));
p2.add(new Button("p2-but-02"));
p1.add(p2, BorderLayout.CENTER);
//下半部
p3.add(new Button("p3-EAST-01"), BorderLayout.EAST);
p3.add(new Button("p3-WEST-02"), BorderLayout.WEST);
for (int i = 0; i < 4; i++) {
p4.add(new Button("p4-but-" + i));
}
p3.add(p4, BorderLayout.CENTER);
frame.add(p1);
frame.add(p3);
//监听窗口关闭事件-适配器
frame.addWindowListener(new WindowAdapter() {
-
Frame是一个顶级窗口
-
Panel无法单独显示,必须添加到某个容器中。
-
布局管理器
-
流程(流式)
-
东西南北中
-
表格
-
-
大小,定位,背景颜色,可见性,监听。
2.4. 事件监听
package com.zhang.lession02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestActionEvent {
public static void main(String[] args) {
Frame frame = new Frame();
Button button = new Button();
MyFrame myFrame = new MyFrame();
//addActionListener:添加动作监听器
//调用监听类
button.addActionListener(myFrame);
frame.setVisible(true);
frame.add(button,BorderLayout.CENTER);
frame.pack();
//调用关闭窗口方法
windonClose(frame);
}
public static void windonClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
2.5. 输入框事件监听
package com.zhang.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestText01 {
public static void main(String[] args) {
//启动类!
new myFrame();
}
}
class myFrame extends Frame{
//创建构造方法,主类可以调用
public myFrame(){
//创建输入框的实例对象
TextField textField = new TextField();
add(textField);
//监听当前输入框中输入的文本信息
myActionListener myActionListener = new myActionListener();
//当点击 enter 时,触发事件
textField.addActionListener(myActionListener);
setVisible(true);
pack();
}
}
class myActionListener implements ActionListener{
2.6 简易计算器
-
面向过程的写法
package com.zhang.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestCalculator {
public static void main(String[] args) {
new MyFrame();
}
}
//Frame架构类
class MyFrame extends Frame {
public MyFrame() {
//3个文本框
TextField num1 = new TextField(10);
TextField num2 = new TextField(10);
TextField num3 = new TextField(20);
//标识符与按钮
Label label = new Label("+");
Button button = new Button("=");
//监听按钮事件
button.addActionListener(new myCalculator(num1, num2, num3));
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
setVisible(true);
pack();
}
}
//计算器类
class myCalculator implements ActionListener {
private TextField num1, num2, num3;
public myCalculator(TextField num1, TextField num2, TextField num3) {
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
-
面向对象的写法
-
组合类:在一个类中组合另外一个类
package com.zhang.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestCalculator {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame {
//属性
public TextField num1, num2, num3;
//方法
public void loadFrame() {
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
Label label = new Label("+");
Button button = new Button("=");
//this:指代的是自己,把自己进行传递
button.addActionListener(new myCalculator(this));
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
}
//监听器类
class myCalculator implements ActionListener {
// 获取计算器对象
// 组合类:在一个类中组合另外一个类
Calculator calculator = null;
public myCalculator(Calculator calculator) {
this.calculator = calculator;
}
-
内部类
package com.zhang.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestCalculator {
public static void main(String[] args) {
//启动类
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame {
//定义属性
public TextField num1, num2, num3;
private Label label;
private Button button;
//方法
public void loadFrame() {
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(10);
label = new Label("+");
button = new Button("=");
//监听器
//this:指代自己,将自己作为参数传入
button.addActionListener(new myCalculator());
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1 + n2));
num1.setText("");
num2.setText("");
}
//内部类
private class myCalculator implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1 + n2));
num1.setText("");
num2.setText("");
}
}
}
2.7 画笔
package com.zhang.lesson04;
import java.awt.*;
public class TestPaint {
public static void main(String[] args) {
new myPaint().loadFrame();
}
}
class myPaint extends Frame {
public void loadFrame() {
setBounds(200, 200, 500, 400);
setVisible(true);
}
//画笔
@Override
public void paint(Graphics g) {
//颜色
g.setColor(Color.blue);
//draw:图形为空心的
g.drawOval(50, 50, 100, 100);
g.setColor(Color.CYAN);
//fill:图形为实心的
g.fillOval(200,200,150,150);
g.setColor(Color.gray);
g.drawRect(100,150,150,200);
}
}
2.8 鼠标监听
package com.zhang.lesson05;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class TestMouseListener {
public static void main(String[] args) {
new MyFrame("画图");
}
}
//自己的类
class MyFrame extends Frame{
//画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点
ArrayList points;//存储鼠标点击时画出的点
public MyFrame(String titel){
super(titel);
setBounds(200,200,400,300);
//存鼠标点击的点
points = new ArrayList<>();
//鼠标监听器,针对当前窗口
this.addMouseListener(new MyMouseListener());
setVisible(true);
}
//画笔方法
2.9 窗口监听
package com.zhang.lesson06;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestWindow {
public static void main(String[] args) {
new MyWindow();
}
}
class MyWindow extends Frame{
public MyWindow(){
setBackground(Color.CYAN);
setBounds(200,200,500,500);
setVisible(true);
this.addWindowListener(
//匿名内部类
new WindowAdapter() {
2.10 键盘监听
package com.zhang.lesson07;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class TestKeyListener {
public static void main(String[] args) {
new MyKeyListener();
}
}
class MyKeyListener extends Frame {
public MyKeyListener() {
setBackground(Color.GREEN);
setBounds(1, 1, 200, 200);
setVisible(true);
this.addKeyListener(new KeyAdapter() {
//键盘按下事件
3. Swing
3.1 窗口、面板
package com.zhang.lesson08;
import javax.swing.*;
import java.awt.*;
public class TestJFrame {
//init();初始化
public void init(){
JFrame jFrame = new JFrame("这是JFrame窗口");
jFrame.setBounds(100,100,200,200);
// jFrame.setBackground(Color.GREEN);
jFrame.setVisible(true);
//设置文字
JLabel label = new JLabel("急急急经济结构");
jFrame.add(label);
//设置文字对齐方式
label.setHorizontalAlignment(SwingConstants.CENTER);
//容器
Container contentPane = jFrame.getContentPane();
contentPane.setBackground(Color.yellow);
//关闭事件
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestJFrame().init();
}
}
3.2 弹窗
-
JDialog:弹窗中默认有关闭事件,所以无需在写关闭事件!
package com.zhang.lesson09;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//主窗口
public class TestDialog extends JFrame {
public TestDialog() {
//设置窗口大小
this.setSize(700,500);
//设置窗口可见性
this.setVisible(true);
//设置窗口可关闭性
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//创建容器,容器不是使用 new 来创建的,二十从 JFrame()中获取的
Container container = this.getContentPane();
//绝对布局,可以自定义窗口中的布局方式
container.setLayout(null);
//配置按钮点击事件,当按钮被点击后,弹出窗口
JButton button = new JButton("点击时弹出窗口");
JLabel jLabel = new JLabel("222");
//设置按钮大小及位置
button.setBounds(30,30,200,50);
//监听器:点击按钮的时候,弹出弹窗
button.addActionListener(new ActionListener() {
3.3 标签
图片:
package com.zhang.lesson10;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class TestImageIcon extends JFrame {
public TestImageIcon(){
URL url = TestImageIcon.class.getResource("tp.jpg");
ImageIcon imageIcon = new ImageIcon(url);
JLabel label = new JLabel("testImage");
label.setIcon(imageIcon);
label.setHorizontalAlignment(SwingConstants.CENTER);
Container container = getContentPane();
container.add(label);
setVisible(true);
setBounds(100,100,500,500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestImageIcon();
}
}
3.4 面板
package com.zhang.lesson11;
import javax.swing.*;
import java.awt.*;
public class JPanelDemo extends JFrame {
public JPanelDemo(){
//获取JFrame组件中的容器
Container container = this.getContentPane();
//布局,布局组件的第二、三两个数分别是水平间距和垂直间距
container.setLayout(new GridLayout(2,1,10,10));
//创建面板
JPanel panel1 = new JPanel(new GridLayout(1, 3));
JPanel panel2 = new JPanel(new GridLayout(1, 2));
JPanel panel3 = new JPanel(new GridLayout(2, 1));
JPanel panel4 = new JPanel(new GridLayout(3, 2));
//创建按钮
panel1.add(new JButton("按钮1"));
panel1.add(new JButton("按钮1"));
panel1.add(new JButton("按钮1"));
panel2.add(new JButton("按钮2"));
panel2.add(new JButton("按钮2"));
panel3.add(new JButton("按钮3"));
panel3.add(new JButton("按钮3"));
panel4.add(new JButton("按钮4"));
panel4.add(new JButton("按钮4"));
panel4.add(new JButton("按钮4"));
panel4.add(new JButton("按钮4"));
panel4.add(new JButton("按钮4"));
//将面板添加到容器中
container.add(panel1);
container.add(panel2);
container.add(panel3);
container.add(panel4);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
文本域 与 滚动窗格
package com.zhang.lesson11;
import javax.swing.*;
import java.awt.*;
public class JTestTextDemo extends JFrame {
public JTestTextDemo(){
//获取容器
Container container = this.getContentPane();
//创建文本域
JTextArea textArea = new JTextArea();
textArea.setText("Hello World!!!");
//创建滚动窗格
JScrollPane scrollPane = new JScrollPane(textArea);
container.add(scrollPane);
this.setVisible(true);
this.setSize(400,300);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JTestTextDemo();
}
}
3.5 按钮
图片按钮:把图片加到按钮上
package com.zhang.lesson12;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtonDemo01 extends JFrame {
//设置初始化参数
public JButtonDemo01() {
//获取容器
Container container = this.getContentPane();
//获取当前包下的图片地址
URL url = JButtonDemo01.class.getResource("tp.jpg");
//创建图片图标对象
Icon imageIcon = new ImageIcon(url);
//将图标放到按钮上
JButton button = new JButton("按钮");
button.setIcon(imageIcon);
button.setToolTipText("图片按钮");
//将按钮添加到容器中
container.add(button);
this.setVisible(true);
this.setSize(400, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo01();
}
}
单选框
package com.zhang.lesson12;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtonDeom02 extends JFrame {
public JButtonDeom02(){
Container container = this.getContentPane();
URL url = JButtonDeom02.class.getResource("tp.jpg");
ImageIcon icon = new ImageIcon(url);
//单选框
JRadioButton radioButton1 = new JRadioButton("radioButton01");
JRadioButton radioButton2 = new JRadioButton("radioButton02");
JRadioButton radioButton3 = new JRadioButton("radioButton03");
//单选框需要分组,不然也会出现可多选的情况
ButtonGroup group = new ButtonGroup();
group.add(radioButton1);
group.add(radioButton2);
group.add(radioButton3);
//将单选框添加到容器中
container.add(radioButton1,BorderLayout.SOUTH);
container.add(radioButton2,BorderLayout.CENTER);
container.add(radioButton3,BorderLayout.NORTH);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDeom02();
}
}
多选框
package com.zhang.lesson12;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtonDeom03 extends JFrame {
public JButtonDeom03(){
Container container = this.getContentPane();
URL url = JButtonDeom03.class.getResource("tp.jpg");
ImageIcon icon = new ImageIcon(url);
//多选框:多选框不用进行分组
JCheckBox checkBox1 = new JCheckBox("多选框_01");
JCheckBox checkBox2 = new JCheckBox("多选框_02");
JCheckBox checkBox3 = new JCheckBox("多选框_03");
container.add(checkBox1,BorderLayout.NORTH);
container.add(checkBox2,BorderLayout.SOUTH);
container.add(checkBox3, BorderLayout.CENTER);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDeom03();
}
}
3.6 列表
下拉框:
package com.zhang.lesson13;
import javax.swing.*;
import java.awt.*;
public class TestComboboxDemo01 extends JFrame {
public TestComboboxDemo01(){
Container container = this.getContentPane();
//下拉框
JComboBox box = new JComboBox();
box.addItem(null);
box.addItem("111");
box.addItem("222");
box.addItem("333");
container.add(box);
this.setVisible(true);
this.setSize(500,400);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestComboboxDemo01();
}
}
-
列表框
package com.zhang.lesson13;
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class TestComboboxDemo02 extends JFrame {
public TestComboboxDemo02() {
Container container = this.getContentPane();
//列表框
// String[] array = {"1","2","3"};//静态数组
Vector vector = new Vector();//动态添加
//将数据按列表形式进行展示
JList list = new JList(vector);
vector.add("张三");
vector.add("李四");
vector.add("王五");
container.add(list);
this.setVisible(true);
this.setSize(500, 400);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestComboboxDemo02();
}
}
3.7 文本框
-
输入框
-
文本域
-
密码框

浙公网安备 33010602011771号