Java 界面编程【02】事件注册
聪明出于勤奋,天才在于积累。——华罗庚
对上次的三个问题的个人理解:
1) 程序首先是从main函数开始执行的,假设main 函数不是 static ,就要先实例化这个类,然后调用 main 方法,这似乎是不现实的. 其次 用 static 修饰的 main 方法是存储在静态的存贮区当中的,也就是说在创建一个类之后,main 函数就已经存在了,去掉 static 修饰之后,编译可以通过,但是不能执行。
2)查 API之后才发现BufferedRead 对象的 readLine()方读到的数据是,读到有换行的地方为一行,直接用 readLine 判断的时候已经读入一行了,在输出数据时就会隔行输出。

FileReader file=new FileReader("C:\\123.txt");
BufferedReader br1=new BufferedReader(file);
//判断的时候已经读入一行
while((br1.readLine())!=null)
{ //输出的是第二行的内容
System.out.println(br1.readLine());
}

所以用一个临时的字符串变量来存储读到的数据,程序改改这样就可以了:

FileReader file=new FileReader("C:\\123.txt");
BufferedReader br1=new BufferedReader(file);
String cd;
while((cd=br1.readLine())!=null)
{
System.out.println(cd);
}

3)如果将客户端、输入流、输出流的初始化全部放进 Send 按钮的事件当中时,程序会达到我想要的效果,点击连接之后就会有客户端连接上去,但总觉得这样会有其他的安全隐患,总有一天它会暴漏的。
今天要记录在这里的是老师随堂布置的一个小程序,实现一个计算器的雏形,里面只有加减运算,对其中的按钮注册有了一点新的认识,还是将代码贴出来先。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*; public class ComboBoxTest extends JFrame{
private JButton done =new JButton(" Done ");
private JButton clear=new JButton(" Clear ");
private JLabel label = new JLabel("Please choose serverID:0(+)and1(-)"); public ComboBoxTest(){
//添加一个组合框并设置两个选项
final JComboBox c = new JComboBox();
int [] array = {0,1};
c.addItem(array[0]);
c.addItem(array[1]); final JTextField operand1=new JTextField(10); //添加第一个操作数为输入文本框,占8列
final JLabel t=new JLabel("+"); //初始化中间的操作符为“+”号
final JTextField operand2=new JTextField(10); //第二个操作符
final JTextField result=new JTextField(4); //结果的文本域 ,初始化占4列 //给组合框c注册一个事件,当组合框选项发生变化的时候,触发的相应事件
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(c.getSelectedIndex()==0) //选项为“0”的时候 令中间的操作符显示“+”号
t.setText(" + ");
else t.setText(" - ");
}
});
//给按钮Done注册一个事件,当中间的操作符不同时进行不同的操作
done.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(c.getSelectedIndex()==0)
{
//当中间的操作符为“+”号时,进行两个操作数的加法 ,文本域的get()方法返回的是字符串,进行强制转换
int a=Integer.parseInt(operand1.getText())+Integer.parseInt(operand2.getText());
result.setText("="+" "+a+" "); //设置结果显示相应的结果
}
else {
//当中间的操作符为“-”号的时候,进行两个操作数的减法
int a=Integer.parseInt(operand1.getText())-Integer.parseInt(operand2.getText());
result.setText("="+" "+a+" ");
}
}
});
// 给按钮clear注册一个事件,清空两个操作数和结果的内容
clear.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
operand1.setText(""); //清空操作数1
operand2.setText(""); //清空操作数2
result.setText(""); //清空结果框
}
});
setLayout(new FlowLayout());
add(label);
add(c);
add(operand1);
add(t);
add(operand2);
add(result);
add(done);
add(clear);
setSize(350,140);
setVisible(true);
} public static void main(String[] args) {
new ComboBoxTest();
}
}

上面的代码中给选项框、“done”、"clear"按钮注册事件的时候所用的都是匿名类,这个类的创建就是为了给相应的组件添加事件,还可以这样写,用里面的“clear”这个按钮来做个例子。
实现 ActionListener 抽象类当中的唯一的一个接口函数,为此定义一个 ButtonListener 监听器的对象

class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
operand1.setText(""); //清空操作数1
operand2.setText(""); //清空操作数2
result.setText(""); //清空结果框
}
}

类属性当中需要定义一个 ButtonListener 的对象属性:
private ButtonListener clearaction = new ButtonListener();
最后一个步骤就是将这个按钮监听器的事件对象注册给按钮:
clear.addActionListener(clearaction);
个人总结:
这一种注册事件的方式大致过程是这样的 ButtonListener =》 ActionListener => 注册给按钮,和匿名类相比,缺点是代码量有点多,但假设你有N个打算具备这种
功能的按钮并且事件实现的方法比较复杂时,就可以实现一个 ActionListener 的对象,同时定义N个 ButtonListener 监听器对象,将相同的事件实现注册给按钮就可以了,相比之下匿名类在这种情形下面会有很大的工作量,代码量会激增。
还可以通过事件 e.getSource()方法将所有的事件处理放进一个函数当中,这样似乎维护起来要更方便一点,在类的声明当中要强调实现接口中的抽象函数。
public class ComboBoxTest extends JFrame implements ActionListener
具体的实现过程如下:

public void actionPerformed(ActionEvent e){
if(e.getSource()==c){
if(c.getSelectedIndex()==0) //选项为“0”的时候 令中间的操作符显示“+”号
t.setText(" + ");
else t.setText(" - ");
}
if(e.getSource()==done){
if(c.getSelectedIndex()==0)
{
//当中间的操作符为“+”号时,进行两个操作数的加法 ,文本域的get()方法返回的是字符串,进行强制转换
int a=Integer.parseInt(operand1.getText())+Integer.parseInt(operand2.getText());
result.setText("="+" "+a+" "); //设置结果显示相应的结果
}
else {
//当中间的操作符为“-”号的时候,进行两个操作数的减法
int a=Integer.parseInt(operand1.getText())-Integer.parseInt(operand2.getText());
result.setText("="+" "+a+" ");
}
}
if(e.getSource()==clear){
operand1.setText(""); //清空操作数1
operand2.setText(""); //清空操作数2
result.setText(""); //清空结果框
}
Java 界面编程【02】事件注册的更多相关文章
- Java 界面编程【03】事件监听
当你把界面都设计好了,总需要添加相应的执行动作给组件,在JAVA中有相应的时间处理机制,叫做“监听器”,给组件添加相应执行动作的过程叫做“注册”,其中的“监听器”是一个接口,里面包含了相应的执行函数, ...
- Java界面编程-建立一个可以画出图形的简单框架
引子:总共使用3个.java文件,建立一个简单界面编程的框架. 第1个文件:NotHelloWorldComponent.java //NotHelloWorldComponent.java 1 im ...
- Java界面编程—事件监听机制
组件首先要先注册事件处理器,当用户单击组件.移动鼠标或者敲击键盘时都会产生事件(Event),一旦有时间发生,应用程序就会做出对该事件的响应,这些组件就是事件源(Event source). 接受.解 ...
- Java界面编程—事件的种类
Java处理事件相应的类和监听接口大多位于 awt 包中. 在 java.swing.event 包中有专门用于 swing 组件的事件类和监听接口. awt 事件类继承自 AWTEvent,其超类是 ...
- Java界面编程—API
Java 的 GUI 提供的对象都存在 java.awt 和 java.swing 两个包中. awt :Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能 ...
- java界面编程(3) ------ 控制布局
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在java 中,组件放置在窗口上的方式可能与其它的GUI系统都不同样.首先,它全 ...
- Java并发编程(02):线程核心机制,基础概念扩展
本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...
- Java界面编程—布局管理
布局是指容器中组件的排列方式 常用的布局管理器 布局管理器名称 所属类包 说明 FlowLayout(流式布局) java.awt 组件按照加入的先后顺序.按照设置的对齐方式从左向右排列,一行排满后到 ...
- java界面编程(8) ------ 组合框(下拉列表)
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 与一组单选button的功能类似,组合框(下拉列表)也是强制用户从一组可能的元素 ...
随机推荐
- java实现验证码功能
java实现验证码功能 通过java代码实现验证码功能的一般思路: 一.通过java代码生成一张验证码的图片,将验证码的图片保存到项目中的指定文件中去,代码如下: package com.util; ...
- LeetCode1089复写零
问题: 给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移. 注意:请不要在超过该数组长度的位置写入元素. 要求:请对输入的数组 就地 进行上述修改,不要 ...
- 使用el-checkbox实现全选,点击失效没有反应
最近在公司接收到了一个需求,给收藏夹的书籍添加批量.全选删除实现思路:点击全选改变item的checked,改变item的checked,重新便利一下所有item的checked来改变全选的selec ...
- Laravel中chunk组块结果集处理
如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令.chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理.使用 chunk 方法能够在处 ...
- DeepFaceLab小白入门(1):软件简介!
简介 DeepFaceLab是一种利用深度学习识别和交换图片和视频中的人脸的工具 这是一个github上的开源项目,所有人都可以查看源代码也能免费使用.个人认为这个项目的最大优点就是安装超级简单,几乎 ...
- nrf开发笔记一开发软件
nrf52810 的开发环境,比较主流的可以使用keil,iar亦可.sdk中,使用的是pca10040e,s112.虽然开发板共用一个型号(pca10040) keil5中,cmsis 需要4.5. ...
- HUD:2853-Assignment(KM算法+hash)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Assignment Time Limit: 2000/1000 MS (Java/Others) ...
- 数学基础:HUD1406-完数
完数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Descript ...
- 使用powershell/vbs自动化模拟鼠标点击操作
今天想做windows上的自动化,所以才有了模拟鼠标点击的需求,先考虑用powershell实现: 首先先安装一个名为“WASP”免费可用的Powershell扩展程序,下载地址:http://was ...
- 以前刷过的FFT
Gym - 101667H 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest #include<bits/stdc++.h> using ...