GUI编程

组件:

  • 窗口
  • 弹窗
  • 面板
  • 文本框
  • 列表框
  • 按钮
  • 图片
  • 监听事件
  • 鼠标
  • 键盘事件

1、简介

GUI的核心技术:Swin、AWT

​ 1、界面不美观

​ 2、需要jre环境

为什么我们要学习?

​ 1、了解MVC架构,了解监听

​ 2、可以写出自己心中想要的小工具

​ 3、工作时可能需要维护到swing界面,概率极小!

2、AWT

2.1、AWT介绍

1、包含了很多的类和接口!

GUI(Graphical User Interface):图形用户界面编程

2、元素:窗口,按钮,文本框

3、java.awt

awt

2.2、组件和容器

1、Frame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package cn.nieqianlong.lesson01;

import java.awt.*;

// GUI的第一个界面
public class TestFrame_01 {
public static void main(String[] args) {

// Frame, JDK, 看源码!
Frame frame = new Frame("我的第一个Java图像界面窗口");

// 需要设置可见性
frame.setVisible(true);

// 设置窗口大小 width height
frame.setSize(400,400);

// 设置背景颜色 Color
frame.setBackground(new Color(75, 167, 182));

// 弹出的初始位置
frame.setLocation(200,200);

// 设置大小固定
frame.setResizable(false);
}
}

Frame

问题:发现窗口关闭不掉,需要停止Java程序运行!

尝试回顾封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cn.nieqianlong.lesson01;

import java.awt.*;

public class TestFrame_02 {
public static void main(String[] args) {
// 展示多个窗口 new
MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.blue);
MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.yellow);
MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.red);
MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.magenta);
}
}

class MyFrame extends Frame{
static int id = 0; // 可能存在多个窗口,需要一个计数器

public MyFrame(int x, int y, int w, int h, Color color){
super("Myframe"+(++id));
setBackground(color);
setBounds(x,y,w,h);
setVisible(true);
}
}

回顾封装

2、面板Panel

解决了关闭事件!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package cn.nieqianlong.lesson01;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

// Panel 可以看成一个空间,但不能单独出现
public class TestPanel_01 {
public static void main(String[] args) {
Frame frame = new Frame();
// 布局的概念
Panel panel = new Panel();

// 设置布局
frame.setLayout(null);

// 坐标
frame.setBounds(300,300,500,500);
frame.setBackground(new Color(134, 134, 90));

// panel设置坐标,相对frame
panel.setBounds(50,50,400,400);
panel.setBackground(new Color(217, 24, 24));

// frame.add(panel) Panel extends Container; Container extends Component
frame.add(panel);

frame.setVisible(true);

// 监听事件,监听窗口关闭事件 System.exit(0)
// 适配器模式:
frame.addWindowListener(new WindowAdapter() {
// 窗口点击关闭的时候要做的事情
@Override
public void windowClosing(WindowEvent e) {
// 结束程序
System.exit(0);
}
});
}
}

面板Panel

3、布局管理器

  • 流式布局

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package cn.nieqianlong.lesson01;

    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    public class TestFlowLayout {
    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");

    // 设置为流式布局
    // frame.setLayout(new FlowLayout());
    // frame.setLayout(new FlowLayout(FlowLayout.LEFT));
    frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
    frame.setSize(200,200);

    // 把按钮添加上去
    frame.add(button1);
    frame.add(button2);
    frame.add(button3);

    frame.setVisible(true);

    frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });

    }
    }
  • 东西南北中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package cn.nieqianlong.lesson01;

    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    public class TestBorderLayout {
    public static void main(String[] args) {
    Frame frame = new Frame("TestBorderLayout");

    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");

    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(200,200);
    frame.setVisible(true);

    frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    }

  • 表格布局Grid

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package cn.nieqianlong.lesson01;

    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    public class TestGridLayout {
    public static void main(String[] args) {
    Frame frame = new Frame("TestGridLayout");

    Button btn1 = new Button("btn1");
    Button btn2 = new Button("btn2");
    Button btn3 = new Button("btn3");
    Button btn4 = new Button("btn4");
    Button btn5 = new Button("btn5");
    Button btn6 = new Button("btn5");

    frame.setLayout(new GridLayout(3,2));

    frame.add(btn1);
    frame.add(btn2);
    frame.add(btn3);
    frame.add(btn4);
    frame.add(btn5);
    frame.add(btn6);

    frame.pack(); // Java函数
    frame.setVisible(true);

    frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    }
  • Exercise

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    package cn.nieqianlong.lesson01;

    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    public class ExerciseDemo {
    public static void main(String[] args) {
    // 总
    Frame frame = new Frame("ExerciseDemo");

    frame.setBounds(300,400,400,300);
    frame.setVisible(true);
    frame.setBackground(Color.BLACK);
    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("East-1"),BorderLayout.EAST);
    p1.add(new Button("West-1"),BorderLayout.WEST);
    p2.add(new Button("p2-btn-1"));
    p2.add(new Button("p2-btn-2"));
    p1.add(p2,BorderLayout.CENTER);

    // 下面
    p3.add(new Button("East-2"),BorderLayout.EAST);
    p3.add(new Button("West-2"),BorderLayout.WEST);
    // 中间的四个
    for (int i = 0; i < 4; i++) {
    p4.add(new Button(("for-"+i)));
    }
    p3.add(p4,BorderLayout.CENTER);

    frame.add(p1);
    frame.add(p3);

    frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    }

Exercise

总结:

  • Frame是一个顶级窗口
  • Panel无法单独显示,必须添加到某个容器中
  • 布局管理器:
    • 流式
    • 东西南北中
    • 表格
  • 大小、定位、背景颜色、可见性、监听

4、事件监听

事件监听:当某个事情发生的时候,干什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package cn.nieqianlong.lesson02;

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("TestActionEvent");
Button button = new Button("This is a button");

// 因为addActionListener需要ActionListener,所以我们需要构造一个ActionListener
MyActionListener myActionListener = new MyActionListener();
button.addActionListener(myActionListener);

frame.add(button,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);

windowClose(frame); // 关闭窗口
}
// 关闭窗体的事件
private static void windowClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

// 事件监听
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("aaa");
}
}

多个按钮共享一个事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package cn.nieqianlong.lesson02;

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 TestActionEvent02 {
public static void main(String[] args) {
// 两个按钮,实现同一个监听
// 开始 停止
Frame frame = new Frame("开始-停止");
Button button1 = new Button("start");
Button button2 = new Button("stop");

// 可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值!
// 可以多个按钮只有一个监听类
button2.setActionCommand("button2-stop");

MyMonitor myMonitor = new MyMonitor();
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);

frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);

frame.setVisible(true);
frame.pack();
windowsClose(frame);

}
private static void windowsClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// e.getActionCommand() 获得按钮的信息
System.out.println("按钮被点击了:msg:"+e.getActionCommand());
if(e.getActionCommand().equals("start")){
System.out.println("Button1 is clicked!");
}
}
}

3、Swin