组件,容器,布局,监听 GUI
AWT
package gui.lesson01;
import java.awt.*;
public class TestFrame {
public static void main(String[] args) {
Frame frame = new Frame("我的第一个图形化界面!"); //Frame jdk,看源码,标题
frame.setSize(200,200); //设置窗口大小
frame.setVisible(true); //需要设置可见性
frame.setLocation(300,300); //弹出的初始位置,左上角坐标为(0,0)
frame.setBackground(new Color(31, 89, 236)); //设置背景颜色 提示Color类,new Color();直接Ctrl+鼠标左键查看Color类源码。
frame.setResizable(false); //设置大小固定
}
}
代码二:
package gui.lesson01;
import java.awt.*;
public class TestFrame2 {
public static void main(String[] args) {
//展示多个窗口,new多个对象,用类封装
new Frame2(100,100,200,200,Color.BLUE);
new Frame2(300,100,200,200,Color.yellow);
new Frame2(100,300,200,200,Color.red);
new Frame2(300,300,200,200,Color.green);
}
}
class Frame2 extends Frame{ // 继承Frame类 封装
static int id = 0; //可能存在多个窗口,需要一个计数器
public Frame2(int x, int y, int w, int h, Color color){
super("Frame"+(++id)); //调用父类构造器
setVisible(true);
setBounds(x,y,w,h);
setBackground(color);
}
}
面板Panel
package gui.lesson01.lesson02;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//Panel面板可以看成一个空间,但不能单独存在,需要放在Frame窗口中。
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame();
Panel panel = new Panel(); //按住Ctrl键,点Panel,发现Panel类继承了container类,container又继承了component类。所以可以在frame.add()中调用。
frame.setBackground(new Color(105, 226, 29)); //设置frame坐标,背景颜色
frame.setBounds(300,300,500,500);
frame.setLayout(null); //设置布局:流布局设置为null,不设置,就会默认把它置顶,窗口中全是红色
panel.setBackground(new Color(215, 36, 36)); //设置相对于frame的坐标,背景颜色
panel.setBounds(100,100,300,300);
frame.add(panel); //把面板添加到frame窗口中
frame.setVisible(true); //设置窗口可见性
//监听事件,监听窗口关闭事件, System exit(0);
//适配器模式
// frame.addWindowListener(new WindowListener() { //可以new WindowListener()这个借口,但需要重写这些方法,所以使用适配器 //一般要写接口的实现类
// @Override
// public void windowOpened(WindowEvent e) {
//
// }
//
// @Override
// public void windowClosing(WindowEvent e) {
//
// }
//
// @Override
// public void windowClosed(WindowEvent e) {
//
// }
//
// @Override
// public void windowIconified(WindowEvent e) {
//
// }
//
// @Override
// public void windowDeiconified(WindowEvent e) {
//
// }
//
// @Override
// public void windowActivated(WindowEvent e) {
//
// }
//
// @Override
// public void windowDeactivated(WindowEvent e) {
//
// }
// });
frame.addWindowListener(new WindowAdapter() { //看addWindowListener()这个方法中,需要什么变量类型,就new一个什么类型,可以new一个子类,这个类包含这个接口的所有方法,采用适配器模式,不用重写这么多方法
//窗口点击关闭时需要做的事情
布局方式
-
流式布局:
package gui.lesson01.lesson02;
import java.awt.*;
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()); //默认是center,居中。
frame.setLayout(new FlowLayout(FlowLayout.LEFT)); //因为LEFT是静态常量,所以可以在new FlowLayout()里面加参数FlowLayout.LEFT。
frame.setBounds(100,100,500,500);
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.setVisible(true);
}
}
-
东西南北中:
package gui.lesson01.lesson02;
import java.awt.*;
public class TestBorderLayout {
public static void main(String[] args) {
Frame frame = new Frame();
Button east = new Button("East");
Button west = new Button("West");
Button north = new Button("North");
Button south = new Button("South");
Button center = new Button("Center");
frame.add(east,BorderLayout.EAST);
frame.add(west,BorderLayout.WEST);
frame.add(north,BorderLayout.NORTH);
frame.add(south,BorderLayout.SOUTH);
frame.add(center,BorderLayout.CENTER);
frame.setSize(200,200);
frame.setVisible(true);
}
}
-
表格布局:
package gui.lesson01.lesson02;
import java.awt.*;
public class TestGridLayout {
public static void main(String[] args) {
Frame frame = new Frame();
Button a = new Button("a");
Button b = new Button("b");
Button c = new Button("c");
Button d = new Button("d");
Button e = new Button("e");
Button f = new Button("f");
frame.setLayout(new GridLayout(2,3)); //表格布局,行,列,行间距,列间距,Ctrl+鼠标点击类看源码,看填写内容类型
frame.add(a);
frame.add(b);
frame.add(c);
frame.add(d);
frame.add(e);
frame.add(f);
frame.pack(); //自动调整窗口内容
frame.setSize(300,300);
frame.setVisible(true);
}
}
小测验
package gui.lesson01.lesson02;
import java.awt.*;
public class Test {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setLayout(new GridLayout(2,1));
frame.setSize(300,300);
frame.setBackground(Color.black);
frame.setVisible(true);
Panel panel1 = new Panel();
Panel panel2 = new Panel();
Panel panel3 = new Panel(new GridLayout(2,1));
Panel panel4 = new Panel(new GridLayout(2,2));
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
Button button4 = new Button("button4");
panel1.add(button1,BorderLayout.WEST);
panel1.add(button2,BorderLayout.EAST);
panel1.add(panel3,BorderLayout.CENTER);
panel3.add(button3);
panel3.add(button4);
panel2.add(new Button("button5"),BorderLayout.WEST);
panel2.add(new Button("button6"),BorderLayout.EAST);
panel2.add(panel4,BorderLayout.CENTER);
for (int i = 0; i < 4; i++) {
panel4.add(new Button("for"+"i"));
}
frame.add(panel1);
frame.add(panel2);
}
}
事件监听
package gui.lesson01.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestActionEventTwo {
public static void main(String[] args) {
Frame frame = new Frame();
Button button1 = new Button("haha");
Button button2 = new Button("hahaha");
//可以显示的定义触发会返回的命令123,如果不定义,会显示默认值hahaha。
button2.setActionCommand("123");
MyMonitor myMonitor = new MyMonitor();
button1.addActionListener(myMonitor); //给按钮加上监听方法addActionListener,方法中需要参数类型为ActionListener,所以用MyMonitor类实现ActionListener接口,然后new一个MyMonitor类的对象,就是ActionListener类型的。
button2.addActionListener(myMonitor); //Person s2 = new Student(); //父类的引用指向子类的类型
frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
frame.setVisible(true);
}
}
class MyMonitor implements ActionListener {
代码二:
package gui.lesson01.lesson03;
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();
MyListener myListener = new MyListener();
button.addActionListener(myListener); //一般监听器后面的类型是接口,但一般不直接new 接口(直接new也是可以的),一般都是new这个接口的实现类。
frame.add(button);
frame.setVisible(true);
frame.pack();
windowsclosing(frame); //一般主程序只调用方法,关闭程序都写在方法体中
}
//关闭窗口的事件
public static void windowsclosing(Frame frame){
frame.addWindowListener(new WindowAdapter() { //new一个这个WindowListener接口的实现类WindowAdapter()
输入框事件监听
package gui.lesson01.lesson03;
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); //文本框加入到窗口中
//监听输入框事件(监听文本框输入的文字)
TextListener textListener = new TextListener();
//按下enter键会触发这个输入框的事件,输入完毕
textField.addActionListener(textListener);
//设置替换编码
textField.setEchoChar('*'); //前台看不到数字,但后台可以看到数字
setVisible(true);
pack();
}
}
class TextListener implements ActionListener{
简易计算器
package gui.lesson01.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextCal {
public static void main(String[] args) {
new MyFrame1();
}
}
class MyFrame1 extends Frame{
public MyFrame1() {
TextField textField01 = new TextField(10); //文本框长度10个字节
TextField textField02 = new TextField(10);
TextField textField03 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+"); //new一个标签栏
setVisible(true);
setLayout(new FlowLayout()); //按流式布局排序
add(textField01); //按从左到右的顺序加入插件
add(label);
add(textField02);
add(button);
add(textField03);
pack(); //自动适应窗口
TextListener01 textListener01 = new TextListener01(textField01,textField02,textField03); //监听器只需要写一个就可以,可以同时监听输入栏和按钮。
//textField01.addActionListener(textListener01); //把每一个插件加入监听器
//textField02.addActionListener(textListener01);
//textField03.addActionListener(textListener01);
button.addActionListener(textListener01); //只有button需要监听事件,其他的都不需要
}
}
class TextListener01 implements ActionListener{ //监听器方法如下:类名想好不要重复
private TextField text01,text02,text03; //定义几个私有化变量,方便把用户输入的值(对象)取到
public TextListener01(TextField text01,TextField text02,TextField text03){ //用户实际需要输入几个值,形参这边就对应几个同类型的变量。形参这可以获得实参的输入值。
this.text01 = text01; //将形参中的值赋给TextListener01类中的局部私有变量,要不TextListener01类不能直接获得和使用用户的输入值。
this.text02 = text02;
this.text03 = text03;
}
代码二:通过组合,进行代码优化
package gui.lesson01.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextCal {
public static void main(String[] args) {
new MyFrame1().loadFrame();
}
}
class MyFrame1 extends Frame{
//属性
TextField textField01,textField02,textField03;
//方法
public void loadFrame() {
textField01 = new TextField(10); //文本框长度10个字节
textField02 = new TextField(10);
textField03 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+"); //new一个标签栏
button.addActionListener(new TextListener01(this)); //给button加一个监听器
setVisible(true);
setLayout(new FlowLayout()); //按流式布局排序
add(textField01); //按从左到右的顺序加入插件
add(label);
add(textField02);
add(button);
add(textField03);
pack(); //自动适应窗口
//TextListener01 textListener01 = new TextListener01(this); //监听器只需要写一个就可以,可以同时监听输入栏和按钮。
// textField01.addActionListener(textListener01); //把每一个插件加入监听器
// textField02.addActionListener(textListener01);
// textField03.addActionListener(textListener01);
//button.addActionListener(textListener01);
}
}
class TextListener01 implements ActionListener{ //监听器方法如下:类名想好不要重复
// private TextField text01,text02,text03; //定义几个私有化变量,方便把用户输入的值(对象)取到
// public TextListener01(TextField text01,TextField text02,TextField text03){ //用户实际需要输入几个值,形参这边就对应几个同类型的变量。形参这可以获得实参的输入值。
// this.text01 = text01; //将形参中的值赋给TextListener01类中的局部私有变量,要不TextListener01类不能直接获得和使用用户的输入值。
// this.text02 = text02;
// this.text03 = text03;
// }
//获取计算器这个对象,在一个类中组合另外一个类
MyFrame1 myFrame1 = null; //通过这个对象获取用户输入的值
public TextListener01(MyFrame1 myFrame1){
this.myFrame1 = myFrame1;
}
代码三:完全的面向对象,程序优化,第一个为面向过程。用内部类。
package gui.lesson01.lesson03;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextCal {
public static void main(String[] args) {
new MyFrame1().loadFrame();
}
}
class MyFrame1 extends Frame{
//属性
TextField textField01,textField02,textField03;
//方法
public void loadFrame() {
textField01 = new TextField(10); //文本框长度10个字节
textField02 = new TextField(10);
textField03 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+"); //new一个标签栏
button.addActionListener(new TextListener01()); //给button加一个监听器
setVisible(true);
setLayout(new FlowLayout()); //按流式布局排序
add(textField01); //按从左到右的顺序加入插件
add(label);
add(textField02);
add(button);
add(textField03);
pack(); //自动适应窗口
}
private class TextListener01 implements ActionListener{ //监听器方法如下:类名想好不要重复