GUI的核心技术:Swing和AWT(抽象窗口工具箱)
1、AWT
1.1 组件和容器
框架Frame :代码实现第一个窗口:
public class FrameDemo {
public static void main(String[] args) {
Frame frame = new Frame("我的第一个窗口");//创建窗口对象
frame.setSize(600,400);//设置窗口大小
frame.setLocation(300,300);//设置窗口在屏幕的坐标
frame.setBackground(Color.BLUE);//设置背景颜色
frame.setVisible(true);//设置窗口可见
frame.setResizable(true);//设置窗口不可变
}
}
这个窗口没有设置关闭事件,只能最小化而不能关闭。
面板panel: 将一个面板添加到窗口上。
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 将一个面板添加到窗口上,解决窗口不能关闭问题。
*/
public class PanelDemo {
public static void main(String[] args) {
Frame frame = new Frame("MY FRAME");
Panel panel = new Panel();//实例化面板的对象
frame.setBounds(300,300,400,300);//设置窗口的大小和坐标
frame.setBackground(Color.BLUE);
frame.setResizable(true);//窗口大小不可变
frame.setVisible(true);
panel.setBounds(100,100,300,200);//设置面板的大小和坐标
panel.setBackground(Color.WHITE);//设置面板的颜色
frame.add(panel);//将面板添加到窗口上
//添加窗口的监听事件,将窗口关闭
frame.addWindowListener(new WindowAdapter() {
//点击窗口的X将窗口关闭
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
1.2 布局管理器
(1)流式布局
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 流式布局
*/
public class FlowLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("流式布局窗口");
frame.setBounds(100,100,400,400);
frame.setBackground(Color.GREEN);
frame.setVisible(true);
//创建新的组件---按钮
Button button1 = new Button("Button1");
Button button2 = new Button("Button2");
Button button3 = new Button("Button3");
//将窗口设置为流式布局
frame.setLayout(new FlowLayout(FlowLayout.TRAILING));
//把按钮添加到窗口上
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
执行结果:
(2)东西南北中
import java.awt.*;
public class BorderLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("东西南北中");
//创建按钮放置在窗口的东西南北中
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(300,300);
frame.setVisible(true);
}
}
执行结果:
(3)表格布局
import java.awt.*;
/**
* 表格布局
*/
public class GridLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("表格布局");
frame.setSize(600,400);
//创建按钮
Button button1 = new Button("Button1");
Button button2 = new Button("Button2");
Button button3 = new Button("Button3");
Button button4 = new Button("Button4");
Button button5 = new Button("Button5");
Button button6 = new Button("Button6");
//将窗口设置为表格布局
frame.setLayout(new GridLayout(2,3));
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);
frame.add(button6);
frame.pack();//窗口自适应
frame.setVisible(true);
}
}
执行结果:
小练习:实现如下图的窗口:
实现思路:
1、创建窗口为表格布局,设置2行1列 ;
2、创建四个面板,第一个和第三个为东西南北中布局,第二个第四个为表格布局;
3、在面板中添加按钮组件;
4、把面板2添加到面板1,把面板4添加到面板3;
5、面板1和面板3添加到窗口,完成了。
import java.awt.*;
public class Test {
public static void main(String[] args) {
Frame frame = new Frame("Test");
frame.setLayout(new GridLayout(2,1));
frame.setSize(600,500);
//创建四个面板
Panel panel1 = new Panel(new BorderLayout());
Panel panel2 = new Panel(new GridLayout(2,1));
Panel panel3 = new Panel(new BorderLayout());
Panel panel4 = new Panel(new GridLayout(2,2));
//面板1的左右分别添加上按钮
panel1.add(new Button("Button"),BorderLayout.EAST);
panel1.add(new Button("Button"),BorderLayout.WEST);
//把Panel2设置为表格布局
panel2.add(new Button("Button"),BorderLayout.NORTH);
panel2.add(new Button("Button"),BorderLayout.SOUTH);
//把面板2添加到面板1
panel1.add(panel2,BorderLayout.CENTER);
//panel3第一步在左右添加两个按钮
panel3.add(new Button("Button"),BorderLayout.EAST);
panel3.add(new Button("Button"),BorderLayout.WEST);
//panel设置为两行两列的表格布局
for (int i = 0; i < 4; i++) {
panel4.add(new Button("Button"));
}
//把面板4添加到面板3
panel3.add(panel4,BorderLayout.CENTER);
//把面板1和面板3放进窗口
frame.add(panel1);
frame.add(panel3);
frame.setVisible(true);
}
}
执行结果:
1.3 事件监听
AWT事件处理机制的概要:
● 监听器对象是一个实现了特定监听器接口的类的实例。
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 ActionEventDemo {
public static void main(String[] args) {
Frame frame = new Frame("事件监听");
frame.setSize(400,300);
frame.setBackground(Color.BLUE);
Button button = new Button("Button");
button.addActionListener(new MyActionListener());
frame.add(button);
frame.setVisible(true);
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("事件监听类");
}
}
多个按钮监听同一个事件:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 多个按钮,共享一个事件
*/
public class ActionListenerDemo2 {
public static void main(String[] args) {
Frame frame = new Frame("多个按钮共享一个事件");
frame.setSize(400, 400);
frame.setResizable(true);
Button button1 = new Button("button-start");
Button button2 = new Button("button-stop");
//要被监听的事件
MyActionListener2 myActionListener2 = new MyActionListener2();
button1.addActionListener(myActionListener2);
button2.addActionListener(myActionListener2);
frame.add(button1,BorderLayout.EAST);
frame.add(button2,BorderLayout.WEST);
frame.add(button2);
frame.pack();
frame.setVisible(true);
}
}
class MyActionListener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮" + e.getActionCommand() + "被点击了");
if (e.getActionCommand().equals("button-start")){
System.out.println("start");
}
}
}
1.4 输入框TextField监听
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 TextFieldDemo {
public static void main(String[] args) {
MyFrame myFrame = new MyFrame();
}
}
class MyFrame extends Frame {
public MyFrame() {
setSize(600,500);
TextField textField = new TextField();//创建文本框
this.add(textField);//将文本框添加到窗口
MyActionListener3 myActionListener3 = new MyActionListener3();
textField.addActionListener(myActionListener3);//给文本框添加监听事件
textField.setEchoChar('*');//将输入的文本替换*
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyActionListener3 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField) e.getSource();
System.out.println(field.getText());//打印输入框的文本
field.setText(null);//获取一次清空一次
}
}
练习:实现窗口计算器的加法
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 Test {
public static void main(String[] args) {
Calculator calculator = new Calculator();
}
}
/**
* 计算器类
*/
class Calculator extends Frame {
public Calculator() {
//先创建放加数和被加数以及计算结果的文本框
TextField textField1 = new TextField(10);
TextField textField2 = new TextField(10);
TextField textField3 = new TextField(20);
//创建一个等号的按钮
Button button = new Button("=");
//给等号添加监听事件
button.addActionListener(new MyActionListener4(textField1, textField2, textField3));
//创建加号标签
Label label = new Label("+");
//流式布局将这些组件添加到窗口
setLayout(new FlowLayout());
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
setVisible(true);
pack();
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
/**
* 监听类
*/
class MyActionListener4 implements ActionListener {
private TextField num1, num2, num3;
public MyActionListener4(TextField num1, TextField num2, TextField num3) {
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
@Override
public void actionPerformed(ActionEvent e) {
//获取加数和被加数
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
int sum = n1 + n2;
//给最后一个框添加计算结果
String getsum = String.valueOf(sum);
num3.setText(getsum);
//把前两个框清空
num1.setText("");
num2.setText("");
}
}
计算器窗口改进版:改为完全面向对象写法
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 ImproveDemo {
public static void main(String[] args) {
new Calculator2().loadName();
}
}
/**
* 计算器类
*/
class Calculator2 extends Frame {
TextField num1;
TextField num2;
TextField num3;
public void loadName() {
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
setSize(500, 500);
setLayout(new FlowLayout());
Label label = new Label("+");
Button button = new Button("=");
CalculatorListener calculatorListener = new CalculatorListener(this);
button.addActionListener(calculatorListener);
add(num1);
add(label);
add(num2);
add(button);
add(num3);
setVisible(true);
pack();
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
/**
* 事件监听类
*/
class CalculatorListener implements ActionListener {
//在监听类中创建计算器类对象,组合类
Calculator2 calculator2 = null;
public CalculatorListener(Calculator2 calculator2) {
this.calculator2 = calculator2;
}
//获取加数被加数计算结果
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(calculator2.num1.getText());
int n2 = Integer.parseInt(calculator2.num2.getText());
int sum = n1 + n2;
String sumText = String.valueOf(sum);
calculator2.num3.setText(sumText);
calculator2.num1.setText("");
calculator2.num2.setText("");
}
}
1.5 画笔
import java.awt.*;
/**
* 测试画笔
*/
public class PaintDemo {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
/**
* 画笔类
*/
class MyPaint extends Frame {
public void loadFrame(){
setSize(400,400);
setVisible(true);
}
@Override
public void paint(Graphics g){
g.setColor(Color.blue);
g.fillOval(100,100,100,100);
g.fillRect(200,200,200,200);
g.setColor(Color.white);
}
}
执行结果:
1.6 鼠标监听:实现鼠标画画
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
/**
* 鼠标监听测试类
*/
public class MouseListenerDemo {
public static void main(String[] args) {
new MyFrame("鼠标画画");
}
}
/**
* 自己实现鼠标画画的类
*/
class MyFrame extends Frame {
//用集合来存储鼠标点击的位置
ArrayList points;
public MyFrame(String title) {
setBounds(200, 200, 400, 400);
setVisible(true);
points = new ArrayList<>();
this.addMouseListener(new MyMouselistener());
}
@Override
public void paint(Graphics g) {
//监听鼠标的事件来画画
Iterator iterator = points.iterator();
while (iterator.hasNext()) {
Point point = (Point) iterator.next();
g.setColor(Color.GREEN);
g.fillOval(point.x, point.y, 50, 50);
}
}
//把这个点添加到界面上
public void addPaint(Point point) {
points.add(point);
}
private class MyMouselistener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
MyFrame frame = (MyFrame) e.getSource();
frame.addPaint(new Point(e.getX(),e.getY()));
frame.repaint();
}
}
}
1.7 窗口监听:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 窗口监听
*/
public class WindowDemo {
public static void main(String[] args) {
new WindowFrame();
}
}
/**
* 窗口类
*/
class WindowFrame extends Frame{
public WindowFrame() {
setBounds(300,300,400,500);
setBackground(Color.green);
setVisible(true);
addWindowListener(new WindowAdapter() {
//关闭窗口
@Override
public void windowClosing(WindowEvent e) {
System.out.println("WindowClosing");
System.exit(0);
}
//激活窗口
@Override
public void windowActivated(WindowEvent e) {
WindowFrame frame = (WindowFrame) e.getSource();
frame.setTitle("激活窗口");
System.out.println("WindowActivated");
}
});
}
}
1.8 键盘监听:
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
/**
* 测试键盘监听类
*/
public class KeyListenerDemo {
public static void main(String[] args) {
new KeyFrame();
}
}
/**
* 监听键盘类
*/
class KeyFrame extends Frame{
public KeyFrame() {
setBounds(200,200,400,400);
setBackground(Color.GREEN);
setVisible(true);
addKeyListener(new KeyAdapter() {
//获取当前按下的键盘的码
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if (keyCode == KeyEvent.VK_C){
System.out.println("You Pressed C Key");
}
}
});
}
}