深入java事件注册的应用分析
程序员文章站
2023-12-14 15:19:22
对上次的三个问题的个人理解: 1) 程序首先是从main函数开始执行的,假设main 函数不是 static ,就要先实例化这个类,然后调用 main 方法,这似乎是不现实...
对上次的三个问题的个人理解:
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(""); //清空结果框
}
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(""); //清空结果框
}