GUI之监听
按钮监听事件
代码的书写顺序
- 先写所需要的所有的组件
- 再写组件需要添加的监听器
- 设置布局
- 把组件添加到frame里面
- 排版(pack()),设置可见性,窗口关闭的监听(可另写一个方法再调用)
package com.li.listen;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//多个按钮共用一个监听事件,通过button.setActionCommand("")设置按钮的动作名(方便后面实现接口的时候来判断是哪一个按钮的事件)
//实现AcitonListener监听事件,通过e.getActionCommand()---获取按钮的信息
// 如果e.getActionCommand().equals("start...(之前设置的按钮的动作名)")这样就可以判断是哪一个按钮点击了,然后再具体书写实现的方法
public class Test1Listener {
public static void main(String[] args) {
Frame frame = new Frame();
Button button = new Button();
//new ActionListener()这是一个接口(通过按住ctrl+鼠标点击可查看),可以书写一个类去实现这个接口
button.addActionListener(new MyActionListener());
frame.add(button,BorderLayout.CENTER);
frame.setVisible(true);
frame.pack();
Close(frame);
}
//书写关闭窗口的方法,封装方法
public static void Close(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("点击这个button以后就会出现的事件");
}
}
输入框监听事件
package com.li.listen;
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 TestTextField {
public static void main(String[] args) {
//主函数里面只写启动
new MyFrame();
}
}
class MyFrame extends Frame {
public MyFrame() throws HeadlessException {
TextField textField = new TextField();
add(textField);
//增加输入框的文本监听事件
textField.addActionListener(new MyactionListener1());
//窗口关闭监听
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
textField.setEchoChar('^');//用^来掩饰输入的字符,用户端不可见,后台可见
setVisible(true);
pack();
}
}
class MyactionListener1 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// e.getSource();是返回一个object对象,所以需要用textfield来接收
TextField field=(TextField)e.getSource();
System.out.println(field.getText());
field.setText("");//当输入回车的时候,启动监听事件,首先打印输入的值,然后设置文本域为“”。
}
}
监听事件的应用(按钮和输入框的监听)
简易计算器的制作
package com.li.listen;
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 TestCalc {
public static void main(String[] args) {
new Calculate();
}
}
//窗口类
class Calculate extends Frame {
public Calculate() throws HeadlessException {
//有三个输入框,一个标签label一个按钮=
TextField field1 = new TextField(10);
TextField field2 = new TextField(10);
TextField field3 = new TextField(20);//后面的参数是输入框的大小长度
Label label = new Label("+");
Button button = new Button("=");
button.addActionListener(new MyCalculateListener(field1 ,field2,field3));
// 设置流式布局
setLayout(new FlowLayout());
//将输入框,标签和按钮添加到frame窗口里面
add(field1);
add(label);
add(field2);
add(button);
add(field3);
pack();
setVisible(true);
//关闭事件
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//监听类
class MyCalculateListener implements ActionListener{
//要明白:下面重写的方法是需要使用前述的输入框啥的,所以进行构造器
private TextField field1,field2,field3;
public MyCalculateListener(TextField field1,TextField field2,TextField field3){
this.field1=field1;
this.field2=field2;
this.field3=field3;
}
@Override
public void actionPerformed(ActionEvent e) {
//获取加数和被加数
int n1=Integer.parseInt( field1.getText());
int n2=Integer.parseInt( field2.getText());
//通过加法运算送到第三个框中
field3.setText(""+(n1+n2));
//清空第一个和第二个框
field1.setText("");
field2.setText("");
}
}
简易计算器制作的代码优化–使用面向对象
以属性+方法的形式,使用内部类实现监听。内部类可以随意调用外部类的属性。
package com.li.listen;
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 TestCalc {
public static void main(String[] args) {
new Calculate().loadFrame();
}
}
//窗口类
//采用面向对象的方法来书写窗口类,然后使用内部类来定义监听类,目的就是简化代码。提高效率
//面向对象=====属性+方法
class Calculate extends Frame {
//属性
TextField field1;
TextField field2;
TextField field3;
//方法
public void loadFrame() {
//有三个输入框,一个标签label一个按钮=
field1 = new TextField(10);
field2 = new TextField(10);
field3 = new TextField(20);//后面的参数是输入框的大小长度
Label label = new Label("+");
Button button = new Button("=");
button.addActionListener(new MyCalculateListener());
// 设置流式布局
setLayout(new FlowLayout());
//将输入框,标签和按钮添加到frame窗口里面
add(field1);
add(label);
add(field2);
add(button);
add(field3);
pack();
setVisible(true);
//关闭事件
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//内部类来实现监听器
// 监听类
class MyCalculateListener implements ActionListener{
//由于是内部类,所以可以直接使用外部类的属性
@Override
public void actionPerformed(ActionEvent e) {
//获取加数和被加数
int n1=Integer.parseInt( field1.getText());
int n2=Integer.parseInt( field2.getText());
//通过加法运算送到第三个框中
field3.setText(""+(n1+n2));
//清空第一个和第二个框
field1.setText("");
field2.setText("");
}
}
}