继续(一)的内容
查看上篇内容:
跟着大神学java第十五课,GUI编程(一):
https://blog.csdn.net/weixin_42681553/article/details/121356227
跟着大神学java第十五课,GUI编程(三):
https://blog.csdn.net/weixin_42681553/article/details/121682018
2.5、输入框TextField监听
public class TestText01 {
public static void main(String[] args) {
//启动
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
//创建文本框
TextField textField = new TextField();
add(textField);
//监听文本框输入的文字
//按下回车即可触发这个事件
MyActionListener2 myActionListener2 = new MyActionListener2();
textField.addActionListener(myActionListener2);
//设置替换编码,输入看不到,打到控制台中,显示输入内容
textField.setEchoChar('*');
//设置属性
setVisible(true);
pack();
//关闭窗口
close(this);
}
//关闭窗口监听方法
public static void close(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyActionListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获得一些资源,e.getSource() 对象为 object 类型,需要强转
TextField textField = (TextField) e.getSource();
System.out.println(textField.getText()); //获得输入框中的文本
//回车获取内容显示到控制台后,清空输入框
textField.setText("");
}
}
2.6、简易计算器,组合+内部类回顾
oop原则:组合,大于继承!
class A {
public B b;
}
加法计算器
1+1=2
分析:三个数字,前两个输入,点击等号按钮,输出结果为第三个数,并清空前两个数,加号不修改
面向过程
//简易计算器
public class TestCalc {
public static void main(String[] args) {
new Calculator();
}
}
//计算器类
class Calculator extends Frame{
public Calculator() {
//3个文本框
TextField num1 = new TextField(10); // 10表示最大字符数
TextField num2 = new TextField(10); // 10表示最大字符数
TextField num3 = new TextField(20); // 10表示最大字符数
//1个按钮
Button button = new Button("=");
button.addActionListener(new MyCalculatorListener(num1, num2, num3));
//1个标签
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
close(this);
}
public static void close(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//监听器类
class MyCalculatorListener implements ActionListener{
//获取三个变量
private TextField num1;
private TextField num2;
private TextField num3;
public MyCalculatorListener(TextField num1, TextField num2, TextField num3){
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数,String转Int
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
//2.将值加法运算后,放入第三个数
num3.setText((n1+n2)+"");
//3.清除前两个框
num1.setText("");
num2.setText("");
}
}
改造为面向对象
//简易计算器
public class TestCalc {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame{
//属性
TextField num1, num2, num3;
//方法
public void loadFrame(){
num1 = new TextField(10); // 10表示最大字符数
num2 = new TextField(10); // 10表示最大字符数
num3 = new TextField(20); // 10表示最大字符数
Button button = new Button("=");
Label label = new Label("+");
button.addActionListener(new MyCalculatorListener(this));
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
close(this);
}
public Calculator() {
close(this);
}
public static void close(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//监听器类
class MyCalculatorListener implements ActionListener{
//获取计算器对象,在另一个类中组合另外一个类
Calculator calculator = null;
public MyCalculatorListener(Calculator calculator){
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数,String转Int
//2.将值加法运算后,放入第三个数
//3.清除前两个框
int n1 = Integer.parseInt(calculator.num1.getText());
int n2 = Integer.parseInt(calculator.num2.getText());
calculator.num3.setText(""+(n1+n2));
calculator.num1.setText("");
calculator.num2.setText("");
}
}
内部类
//简易计算器
public class TestCalc {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame{
//属性
TextField num1, num2, num3;
//方法
public void loadFrame(){
num1 = new TextField(10); // 10表示最大字符数
num2 = new TextField(10); // 10表示最大字符数
num3 = new TextField(20); // 10表示最大字符数
Button button = new Button("=");
Label label = new Label("+");
button.addActionListener(new MyCalculatorListener());
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
close(this);
}
//监听器类(内部类)
//最大的好处就是,可以畅通无阻地访问外部的属性和方法
private class MyCalculatorListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数,String转Int
//2.将值加法运算后,放入第三个数
//3.清除前两个框
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText(""+(n1+n2));
num1.setText("");
num2.setText("");
}
}
//其他方法:关闭窗口按钮(可省略)
public Calculator() {
close(this);
}
//关闭窗口按钮(可省略)
public static void close(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
2.7、画笔
通过代码自动生成画
//画笔
public class TestPaint {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame{
public void loadFrame(){
setBounds(200,200,700,500);
setVisible(true);
close(this);
}
//画笔
@Override
public void paint(Graphics g) {
// super.paint(g);
g.setColor(Color.CYAN);
// g.drawOval(100,100,100,100); //空心的圆
g.fillOval(100,100,100,100); //实心的圆
g.setColor(Color.green);
g.fillRect(150,200,200,200);//矩形
//养成习惯,画笔用完,将他还原到最初的颜色(黑色)
g.setColor(Color.BLACK);
}
public void close(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
2.8、鼠标监听事件
目的:实现鼠标画画
//监听鼠标事件,实现画图
public class TestMouseListener {
public static void main(String[] args) {
new MyFrame("画图");
}
}
//自己的类
class MyFrame extends Frame{
//画画需要画笔,需要监听鼠标当前位置,需要集合存储画出的点
ArrayList points;
public MyFrame(String title) {
//1.设置窗口名称和画面
super(title);
setBounds(200,200,400,300);
//存储鼠标点击的点位置
points = new ArrayList<>();
//2.鼠标监听器,监听画图窗口
this.addMouseListener(new MyMouseListener());
setVisible(true);
close(this);
}
//2.监听事件的内容,需要获取鼠标位置传到数组中,用来增加点
//通过继承不需要重写全部的方法,适配器模式 MouseAdapter
private class MyMouseListener extends MouseAdapter {
//鼠标按下事件
@Override
public void mousePressed(MouseEvent e) {
//2.1 e是鼠标所有事件,可以拿到鼠标位置,放入Frame大类中的数组里,需要强转
MyFrame myFrame = (MyFrame) e.getSource();
//2.2 在e中过去的鼠标位置,写入到数组中
//点击鼠标按压时,在画面上画出一个点
//获取鼠标位置画点
myFrame.points.add(new Point(e.getX(),e.getY()));
//第一遍刚加载,数组为空,监听鼠标事件画图无内容,再次点击,point方法不会再次执行,所以需要 myFrame.repaint() 刷新页面
//每次点击鼠标,都需要重新画一遍
myFrame.repaint();
}
}
//3.在数组中通过迭代器,获取点的位置并画出
@Override
public void paint(Graphics g) {
//画画,需要监听鼠标的事件
Iterator iterator = points.iterator(); //迭代器,不建议使用for循环
while (iterator.hasNext()){ //判断数组中还有值,则继续画点
Point point = (Point) iterator.next();
g.setColor(Color.BLACK);
g.fillOval(point.x,point.y,10,10);
}
}
public void close(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
2.9、窗口监听事件
public class TestWindow {
public static void main(String[] args) {
new WindowFrame();
}
}
class WindowFrame extends Frame{
public WindowFrame() {
setBackground(Color.CYAN);
setBounds(100,100,200,200);
setVisible(true);
//搭配内部类调用使用
// addWindowListener(new MyWindowsListerner());
this.addWindowListener(
//匿名内部类
new WindowAdapter() {
//窗口关闭中
@Override
public void windowClosing(WindowEvent e) {
System.out.println("windowClosing");
System.exit(0);
}
//窗口激活(鼠标焦点重新回到当前窗口)
@Override
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated");
}
});
}
//内部类,不建议使用,建议使用匿名内部类
// class MyWindowsListerner extends WindowAdapter{
// @Override
// public void windowClosing(WindowEvent e) {
// setVisible(false); //隐藏窗口,通过按钮
// System.exit(0); //正常退出
// }
// }
}
2.10、键盘监听事件
//键盘监听
public class TestKeyListener {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame{
public KeyFrame() {
setBounds(0,0,300,400);
setVisible(true);
this.addKeyListener(new KeyAdapter() {
//键盘按下
@Override
public void keyPressed(KeyEvent e) {
//获取键盘按下的键
int keyCode = e.getKeyCode();
System.out.println(keyCode); //int类型展示,使用时通过静态属性(例:VK_UP)调用
//判断按上时触发
if (keyCode == KeyEvent.VK_UP){
System.out.println("向上");
}
}
});
}
}