GUI
1 Frame
用来创建窗口,构造函数如下:
public Frame() throws HeadlessException
public Frame(String title) throws HeadlessException
常用方法如下:
public class gui_v1 {
public static void main(String[] args) {
Frame f = new Frame();
f.setTitle("啊八八八八吧");
f.setLocation(1000,500);
f.setSize(300,300);
f.setVisible(true);
}
}
2 Button和TextField
2.1 Button
用来创建按钮,构造方法是Button(String label)
public class gui_v1 {
public static void main(String[] args) {
Frame f = new Frame();
Button b = new Button("abc");
f.setTitle("啊八八八八吧");
f.setLocation(1000,500);
f.setSize(300,300);
f.add(b);
f.setVisible(true);
}
}
2.2 TextField
用来创建一个单行的编辑框,常用构造方法是:
public TextField() throws HeadlessException
public TextField(String text) throws HeadlessException
public class gui_v2 {
public static void main(String[] args) {
Frame f = new Frame("im learning");
TextField t = new TextField("im text");
f.setLocation(500,500);
f.setSize(300,300);
f.add(t);
f.setVisible(true);
}
}
3 Component
是能够在屏幕上显示的图形化的表现形式,能够和用户进行交互
4 布局管理器
布局管理器是Java对象,作用是管理组件的布局。Container是提供setLayout()方法进行布局设置。
public class Container_v1 {
public static void main(String[] args) {
Frame f = new Frame("im studting!");
Button b1 = new Button("abc");
Button b2 = new Button("def");
FlowLayout fl = new FlowLayout();
f.setSize(1000,500);
f.setLocation(300,300);
f.setLayout(fl);
f.add(b1);
f.add(b2);
f.setVisible(true);
}
}
- Flowlayout
将容器中的组件逐行排列,一行排满之后再换行。可以设置空间间距及对齐方式
- Borderlayout
将容器划分东西南北中,每个区域只能放一个组件
Frame和diago是默认的Borderlayout
public class Container_v3 {
public static void main(String[] args) {
Frame f = new Frame();
Button b1 = new Button("b1");
Button b2 = new Button("b2");
Button b3 = new Button("b3");
Button b4 = new Button("b4");
Button b5 = new Button("b5");
f.setSize(1000,500);
f.setLocation(300,300);
f.add(b1,BorderLayout.EAST);
f.add(b2,BorderLayout.CENTER);
f.add(b3,BorderLayout.NORTH);
f.add(b4,BorderLayout.WEST);
f.add(b5,BorderLayout.SOUTH);
f.setVisible(true);
}
}
5 Dialog和panel
dialog就是对话框,都是window的子类,与Frame的主要区别在于Frame可以包含菜单栏,Dialog是不能包含菜单栏的。
dialog不可以作为主界面,必须具备拥有者,作为特定功能为用户交互。
public class dialog_v1 {
public static void main(String[] args) {
Frame f = new Frame();
Dialog d = new Dialog(f);
d.setSize(1000,500);
d.setLocation(300,300);
d.setVisible(true);
}
}
Panel是container但是不是window,必须附着再顶层容器之上。默认布局管理器是Flowlayout
public class panel_v1 {
public static void main(String[] args) {
Frame f = new Frame();
Panel p1 = new Panel();
Panel p2 = new Panel();
Button b1 = new Button("b1");
Button b2 = new Button("b2");
Button b3 = new Button("b3");
Button b4 = new Button("b4");
Button b5 = new Button("b5");
f.setSize(1000,500);
f.setLocation(300,300);
p1.add(b1);p2.add(b2);p2.add(b2);
p2.add(b4);p2.add(b5);
f.add(p1,BorderLayout.NORTH);
f.add(p2,BorderLayout.SOUTH);
f.setVisible(true);
}
}
6 事件处理
事件源:事件的发起者,通常是一个组件
事件的处理:处理方式通常是一个方法,一个特点类的特定成员方法。
一定要实现Actionlistener方法
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Event_v1 {
public static void main(String[] args) {
Frame f = new Frame("我在学习GUI");
Button b1 = new Button("我是第一个按钮");
Button b2 = new Button("我是第二个按钮");
f.setSize(1000 , 500);
f.setLocation(300 , 300);
Respp r1 = new Respp();
b1.addActionListener(r1);
b2.addActionListener(r1);
b1.setSize(70,80);
b1.setLocation(300,200);
b2.setSize(70,80);
b2.setLocation(300,400);
f.add(b1);
f.add(b2);
f.setVisible(true);
}
}
class Respp implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("aaaaaaaa");
}
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Event_v2 {
public static void main(String[] args) {
Frame f = new Frame("我在学习GUI");
Button b1 = new Button("我是第一个按钮");
Button b2 = new Button("我是第二个按钮");
f.setSize(1000 , 500);
f.setLocation(300 , 300);
r2 r1 = new r2();
b1.addActionListener(r1);
b2.addActionListener(r1);
b1.setSize(70,80);
b1.setLocation(300,200);
b2.setSize(70,80);
b2.setLocation(300,400);
f.add(b1);
f.add(b2);
f.setVisible(true);
}
}
class r2 implements ActionListener{
Button b = new Button();
@Override
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if(o instanceof Button){
b = (Button)o;
System.out.println(b.getLabel() + "aaaaa");
}
}
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Event_v3 {
public static void main(String[] args) {
Frame f = new Frame();
Button b1 = new Button("im b1");
Button b2 = new Button("im b2");
TextField tf = new TextField();
f.setSize(1000 , 500);f.setLocation(300 , 300);
b1.setSize(100,50);b1.setLocation(300,200);
b2.setSize(70,80);b2.setLocation(300,400);
tf.setSize(200 , 50);tf.setLocation(0,400);
resp2 r2 = new resp2(tf);
b1.addActionListener(r2);
b2.addActionListener(r2);
f.setLayout(null);
f.add(b1);
f.add(b2);
f.add(tf);
f.setVisible(true);
}
}
class resp2 implements ActionListener{
TextField tf;
Button b;
public resp2(TextField tf){this.tf = tf;}
@Override
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if(o instanceof Button){
b = (Button)o;
tf.setText(b.getLabel()+"被点击");
}
}
}
- 不同类型的event,对应的处理函数所在类实现的接口不同
- 不同类型的event,在被监听时需要调用不同的函数
- Button对应的消息处理函数所在的类必须实现ActionListenrt接口,监听函数时addActionListener
- Frame和Dialog对应的消息处理函数所在的类必须实现WindowListener,监听函数时addWindowListener
7 适配器
事件处理方法所在的类需要实现特定的接口,实现接口要实现全部的方法,然鹅只有某些方法是有用的,其他方法是空方法,可以避免实现一些方法
WindowAdapter是一个类,实现了WindowListener接口
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Event_v4 {
public static void main(String[] args) {
Frame f = new Frame("我在学习GUI");
f.setSize(1000 , 500);f.setLocation(300 , 300);
resp4 resp = new resp4();
f.addWindowListener(resp);
f.setVisible(true);
}
}
class resp4 extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}