热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java基础总结27javaGUI编程2

1事件监听测试代码一:packagecn.javastudy.summary;importjava.awt.*;importjava.awt.event.*;pu

1 事件监听

这里写图片描述

测试代码一:

package cn.javastudy.summary;import java.awt.*;
import java.awt.event.*;public class TestActionEvent {public static void main(String args[]) {Frame f = new Frame("TestActionEvent");Button btn = new Button("Press Me");Monitor m = new Monitor();/* 创建一个监听对象 */btn.addActionListener(m);/** 把监听加入到按钮里面,监听按钮的动作, 当按钮触发打击事件时,就会返回一个监听对象e 然后就会自动执行actionPerformed方法*/f.add(btn, BorderLayout.CENTER);f.pack();addWindowClosingEvent(f);/* 调用这个方法可以自动给Frame窗体里面的子图形元素一个合适的初始大小 */f.setVisible(true);}/*** 点击窗体上的关闭按钮关闭窗体* @param f*/private static void addWindowClosingEvent(Frame f){f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent arg0) {System.exit(0);}});}
}/** 自定义Monitor(监听)类实现事件监听接口ActionListener 一个类要想成为监听类,那么必须实现ActionListener接口*/
class Monitor implements ActionListener {/* 重写ActionListener接口里面的actionPerformed(ActionEvent e)方法 */public void actionPerformed(ActionEvent e) {System.out.println("A Button has been Pressed");}
}

测试代码二:

package cn.javastudy.summary;import java.awt.*;
import java.awt.event.*;
public class TestActionEvent2{public static void main(String args[]){Frame f = new Frame("TestActionEvent");Button btn1 = new Button("start");Button btn2 = new Button("stop");Monitor2 m2 = new Monitor2();//创建监听对象btn1.addActionListener(m2);/*一个监听对象同时监听两个按钮的动作*/btn2.addActionListener(m2);btn2.setActionCommand("GameOver");//设置btn2的执行单击命令后的返回信息f.add(btn1,BorderLayout.NORTH);f.add(btn2,BorderLayout.CENTER);f.pack();f.setVisible(true);}
}class Monitor2 implements ActionListener{public void actionPerformed(ActionEvent e){System.out.println("a button has been pressed,"+"the relative info is:\n"+e.getActionCommand());/*使用返回的监听对象e调用getActionCommand()方法获取两个按钮执行单击命令后的返回信息根据返回信息的不同区分开当前操作的是哪一个按钮,btn1没有使用setActionCommand()方法设置则btn1返回的信息就是按钮上显示的文本*/}
}

2 TextField事件监听

这里写图片描述

测试代码:

package cn.javastudy.summary;import java.awt.*;
import java.awt.event.*;public class TestTextField {public static void main(String args[]) {new MyFrameTextField();}
}class MyFrameTextField extends Frame {MyFrameTextField() {TextField tf = new TextField();add(tf);tf.addActionListener(new Monitor3());tf.setEchoChar('*');/** 这个setEchoChar()方法是设置文本框输入时显示的字符,这里设置为*, * 这样输入任何内容就都以*显示出来,不过打印出来时依然可以看到输入的内容*/setVisible(true);pack();}
}class Monitor3 implements ActionListener {/** 接口里面的所有方法都是public(公共的) * 所以从API文档复制void actionPerformed(ActionEvent e)时 要在void前面加上public*/public void actionPerformed(ActionEvent e) {/* 事件的相关信息都封装在了对象e里面,通过对象e的相关方法就可以获取事件的相关信息 */TextField tf = (TextField) e.getSource();/** getSource()方法是拿到事件源,注意:拿到这个事件源的时候,* 是把它当作TextField的父类来对待 * getSource()方法的定义是:“public Object getSource()”返回值是一个Object对象,* 所以要强制转换成TextField类型的对象 * 在一个类里面想访问另外一个类的事件源对象可以通过getSource()方法*/System.out.println(tf.getText());// tf.getText()是取得文本框里面的内容tf.setText("");// 把文本框里面的内容清空}
}

使用TextField类实现简单的计算器

package cn.javastudy.summary;import java.awt.*;
import java.awt.event.*;public class TestMath {public static void main(String args[]) {new TFFrame();}
}/* 这里主要是完成计算器元素的布局 */
class TFFrame extends Frame {TFFrame() {/** 创建3个文本框,并指定其初始大小分别为10个字符和15个字符的大小 这里使用的是TextField类的另外一种构造方法 public TextField(int columns)*/TextField num1 = new TextField(10);TextField num2 = new TextField(10);TextField num3 = new TextField(15);/* 创建等号按钮 */Button btnEqual = new Button("=");btnEqual.addActionListener(new MyMonitor(num1, num2, num3));/* 给等号按钮加上监听,让点击按钮后有响应事件发生 */Label lblPlus = new Label("+");/* “+”是一个静态文本,所以使用Label类创建一个静态文本对象 */setLayout(new FlowLayout());/* 把Frame默认的BorderLayout布局改成FlowLayout布局 */add(num1);add(lblPlus);add(num2);add(btnEqual);add(num3);pack();setVisible(true);}
}class MyMonitor implements ActionListener {TextField num1, num2, num3;/** 为了使对按钮的监听能够对文本框也起作用, * 所以在自定义类MyMonitor里面定义三个TextField类型的对象 num1,num2,num3,* 并且定义了MyMonitor类的一个构造方法 这个构造方法带有三个TextField类型的参数,* 用于接收 从TFFrame类里面传递过来的三个TextField类型的参数 * 然后把接收到的三个TextField类型的参数赋值给在本类中声明的 三个TextField类型的参数num1,num2,num3 然后再在actionPerformed()方法里面处理num1,num2,num3*/public MyMonitor(TextField num1, TextField num2, TextField num3) {this.num1 = num1;this.num2 = num2;this.num3 = num3;}public void actionPerformed(ActionEvent e) {/* 事件的相关信息都封装在了对象e里面,通过对象e的相关方法就可以获取事件的相关信息 */int n1 = Integer.parseInt(num1.getText());/* num1对象调用getText()方法取得自己显示的文本字符串 */int n2 = Integer.parseInt(num2.getText());/* num2对象调用getText()方法取得自己显示的文本字符串 */num3.setText("" + (n1 + n2));/* num3对象调用setText()方法设置自己的显示文本 */num1.setText("");/* 计算结束后清空num1,num2文本框里面的内容 */num2.setText("");// num3.setText(String.valueOf((n1+n2)));/* 字符串与任意类型的数据使用“+”连接时得到的一定是字符串,* 这里使用一个空字符串与int类型的数连接,这样就可以直接把(n1+n2)得到的int类型的数隐式地转换成字符串了,* 这是一种把别的基础数据类型转换成字符串的一个小技巧。* 也可以使用“String.valueOf((n1+n2))”把(n1+n2)的和转换成字符串 */}
}

JAVA里面的经典用法:在一个类里面持有另外一个类的引用

package cn.javastudy.summary;import java.awt.*;
import java.awt.event.*;public class TestMath1 {public static void main(String args[]) {new TTMyFrame().launchFrame();/* 创建出TTMyFrame对象后调用lauchFrame()方法把计算器窗体显示出来 */}
}/* 做好计算器的窗体界面 */
class TTMyFrame extends Frame {/* 把设计计算器窗体的代码封装成一个方法 */TextField num1, num2, num3;public void launchFrame() {num1 = new TextField(10);num2 = new TextField(15);num3 = new TextField(15);Label lblPlus = new Label("+");Button btnEqual = new Button("=");btnEqual.addActionListener(new MyMonitorbtnEqual(this));setLayout(new FlowLayout());add(num1);add(lblPlus);add(num2);add(btnEqual);add(num3);pack();setVisible(true);}
}/** 这里通过取得TTMyFrame类的引用,然后使用这个引用去访问TTMyFrame类里面的成员变量 * 这种做法比上一种直接去访问TTMyFrame类里面的成员变量要好得多,* 因为现在不需要知道 TTMyFrame类里面有哪些成员变量了,* 现在要访问TTMyFrame类里面的成员变量,直接使用 TTMyFrame类对象的引用去访问即可,* 这个TTMyFrame类的对象好比是一个大管家, 而我告诉大管家,我要访问TTMyFrame类里面的那些成员变量,* 大管家的引用就会去帮我找,不再需要我自己去找了。 * 这种在一个类里面持有另一个类的引用的用法是一种非常典型的用法 * 使用获取到的引用就可以在一个类里面访问另一个类的所有成员了*/
class MyMonitorbtnEqual implements ActionListener {TTMyFrame ttmf = null;public MyMonitorbtnEqual(TTMyFrame ttmf) {this.ttmf = ttmf;}public void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(ttmf.num1.getText());int n2 = Integer.parseInt(ttmf.num2.getText());ttmf.num3.setText("" + (n1 + n2));ttmf.num1.setText("");ttmf.num2.setText("");}
}

运行结果如下:

这里写图片描述

3 内部类

这里写图片描述

内部类的使用范例:

package cn.javastudy.summary;import java.awt.*;
import java.awt.event.*;public class TestMath3 {public static void main(String args[]) {new MyMathFrame().launchFrame();}
}class MyMathFrame extends Frame {TextField num1, num2, num3;public void launchFrame() {num1 = new TextField(10);num2 = new TextField(15);num3 = new TextField(15);Label lblPlus = new Label("+");Button btnEqual = new Button("=");btnEqual.addActionListener(new MyMonitor());setLayout(new FlowLayout());add(num1);add(lblPlus);add(num2);add(btnEqual);add(num3);pack();setVisible(true);}/** 这个MyMonitor类是内部类,它在MyFrame类里面定义 MyFrame类称为MyMonitor类的包装类*//** 使用内部类的好处: * 第一个巨大的好处就是可以畅通无阻地访问外部类(即内部类的包装类)的所有成员变量和方法 * 如这里的在MyFrame类(外部类)定义的三个成员变量num1,num2,num3, * 在MyMonitor(内部类)里面就可以直接访问 * 这相当于在创建外部类对象时内部类对象默认就拥有了一个外部类对象的引用*/private class MyMonitor implements ActionListener {public void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());num3.setText("" + (n1 + n2));num1.setText("");num2.setText("");}}
}

内部类带来的巨大好处是:

  • 可以很方便地访问外部类定义的成员变量和方法
  • 当某一个类不需要其他类访问的时候就把这个类声明为内部类。

4 Graphics 类

这里写图片描述

测试代码:

package cn.javastudy.summary;import java.awt.*;
public class TestPaint{public static void main(String args[]){new MyPaint().launchFrame();/*在main()方法里面并没有显示调用paint(Graphics g)方法可是当创建出Frame窗体后却可以看到Frame窗体上画出了圆和矩形,这是因为paint()方法是一个比较特殊的方法在创建Frame窗体时会自动隐式调用当我们把Frame窗体最小化又再次打开时,又会再次调用paint()方法重新把圆和矩形在Frame窗体上画出来即每次需要重画Frame窗体的时候就会自动调用paint()方法*/}
}class MyPaint extends Frame{public void launchFrame(){setBounds(200,200,640,480);setVisible(true);}public void paint(Graphics g){/*paint(Graphics g)方法有一个Graphics类型的参数g我们可以把这个g当作是一个画家,这个画家手里拿着一只画笔我们通过设置画笔的颜色与形状来画出我们想要的各种各样的图像*//*设置画笔的颜色*/g.setColor(Color.red);g.fillOval(100,100,100,100);/*画一个实心椭圆*/g.setColor(Color.green);g.fillRect(150,200,200,200);/*画一个实心矩形*//*这下面的两行代码是为了写程序的良好编程习惯而写的前面设置了画笔的颜色,现在就应该把画笔的初始颜色恢复过来就相当于是画家用完画笔之后把画笔上的颜色清理掉一样*/Color c = g.getColor();g.setColor(c);}
}

运行结果:

这里写图片描述

5 鼠标事件适配器

这里写图片描述

测试代码:

package cn.galc.test;import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class MyMouseAdapter{public static void main(String args[]) {new MyFrame("drawing...");}
}class MyFrame extends Frame {ArrayList points = null;MyFrame(String s) {super(s);points = new ArrayList(); setLayout(null);setBounds(300,300,400,300); this.setBackground(new Color(204,204,255));setVisible(true);this.addMouseListener(new Monitor());}public void paint(Graphics g) {Iterator i = points.iterator();while(i.hasNext()){Point p = (Point)i.next();g.setColor(Color.BLUE);g.fillOval(p.x,p.y,10,10);}}public void addPoint(Point p){points.add(p);}
}class Monitor extends MouseAdapter {public void mousePressed(MouseEvent e) {MyFrame f = (MyFrame)e.getSource();f.addPoint(new Point(e.getX(),e.getY()));f.repaint();}
}

6 window事件

这里写图片描述

测试代码:

package cn.galc.test;import java.awt.*;
import java.awt.event.*;
public class TestWindowClose{public static void main(String args[]){new WindowFrame("关闭WindowFrame");}
}class WindowFrame extends Frame{public WindowFrame(String s){super(s);setBounds(200,200,400,300);setLayout(null);setBackground(new Color(204,204,255));setVisible(true);this.addWindowListener(new WindowMonitor());
/*监听本窗体的动作,把所有的动作信息封装成一个对象传递到监听类里面*/this.addWindowListener(/*在一个方法里面定义一个类,这个类称为局部类,也叫匿名的内部类,这里的{……代码……}里面的代码很像一个类的类体,只不过这个类没有名字,所以叫匿名类在这里是把这个匿名类当成WindowAdapter类来使用,语法上这样写的本质意义是相当于这个匿名类从WindowAdapter类继承,现在new了一个匿名类的对象出来然后把这个对象当成WindowAdapter来使用这个匿名类出了()就没有人认识了*/new WindowAdapter(){public void windowClosing(WindowEvent e){setVisible(false);System.exit(-1);}});}/*这里也是将监听类定义为内部类*/class WindowMonitor extends WindowAdapter{/*WindowAdapter(Window适配器)类实现了WindowListener监听接口重写了WindowListener接口里面的所有方法如果直接使用自定义WindowMonitor类直接去实现WindowListener接口,那么就得要重写WindowListener接口里面的所有方法,但现在只需要用到这些方法里面的其中一个方法所以采用继承实现WindowListener监听接口的一个子类并重写这个子类里面需要用到的那个方法即可这种做法比直接实现WindowListener监听接口要重写很多个用不到的方法要简洁方便得多*/
/*重写需要用到的windowClosing(WindowEvent e)方法*/public void windowClosing(WindowEvent e){setVisible(false);/*将窗体设置为不显示,即可实现窗体关闭*/System.exit(0);/*正常退出*/}}
}

7 键盘响应事件——KeyEvent

测试代码:

package cn.galc.test;import java.awt.*;
import java.awt.event.*;
public class TestKeyEvent{public static void main(String args[]){new KeyFrame("键盘响应事件");}
}class KeyFrame extends Frame{public KeyFrame(String s){super(s);setBounds(200,200,400,300);setLayout(null);setVisible(true);addKeyListener(new KeyMonitor());}/*把自定义的键盘的监听类定义为内部类这个监听类从键盘适配器KeyAdapter类继承从KeyAdapter类继承也是为了可以简洁方便只需要重写需要用到的方法即可,这种做法比直接实现KeyListener接口要简单方便,如果直接实现KeyListener接口就要把KeyListener接口里面的所有方法重写一遍,但真正用到的只有一个方法,这样重写其他的方法但又用不到难免会做无用功*/ class KeyMonitor extends KeyAdapter{public void keyPressed(KeyEvent e){int keycode = e.getKeyCode();/*使用getKeyCode()方法获取按键的虚拟码*//*如果获取到的键的虚拟码等于up键的虚拟码则表示当前按下的键是up键KeyEvent.VK_UP表示取得up键的虚拟码键盘中的每一个键都对应有一个虚拟码这些虚拟码在KeyEvent类里面都被定义为静态常量所以可以使用“类名.静态常量名”的形式访问得到这些静态常量*/if(keycode == KeyEvent.VK_UP){System.out.println("你按的是up键");}}}
}
/*键盘的处理事件是这样的:每一个键都对应着一个虚拟的码,
当按下某一个键时,系统就会去找这个键对应的虚拟的码,以此来确定当前按下的是那个键
*/


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
author-avatar
袁甲2012_498
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有