Java给按钮添加事件

Java给按钮添加事件,第1张

赞一个, 提前学习, 做好预先 , 是个好习惯.

java图形界面主要有AWT, SWING, SWT, JavaFx等技术

JButton  (按钮)是SWING里面很常用的组件. 直接添加按钮到窗口,并不会产生任何交互效果.

要想产生交互效果,就需要了解awt,swing的事件处理机制:

事件:用户对组件的一个 *** 作,称之为一个事件;

事件源:发生事件的组件就是事件源;

事件处理器:负责处理事件的方法;

比如 点击按钮,d出HelloWord,

那么 事件是 点击按钮 ,事件源就是按钮,事件处理器就会d出对话框,显示HelloWord.

常用的事件(Event) 有:

鼠标事件(MouseEvent: 鼠标按下,移入,移除,滚轮..)

键盘事件(KeyEvent: 键盘按下,释放..)

动作事件( ActionEvent:当按钮、菜单项被点击,在JTextField中按Enter键时...触发该事件。)

按钮添加接收器, 不同的事件,接收器不同.

比如ActionEvent 那么他的接收器是ActionListener

KeyEvent 那么他的接收器就是KeyListener

基础知识,大概就是这些.

所以想要JButton产生交互,你就需要给他添加事件处理器,当发生这些事件时,出发该处理器,进行处理.

写2个例子,第一个简单的:点击按钮,d出Hello World

//导入3个图形界面,常用的包

import java.awt.*

import java.awt.event.*

import javax.swing.*

public class ButtonDemo extends JFrame {

 

 public ButtonDemo() {

  

  JButton jbHello = new JButton("Hello")//按钮

  jbHello.addActionListener(new ActionListener() {//给按钮添加事件接收器

   @Override

   public void actionPerformed(ActionEvent e) {//接受到事件后,进行下面的处理

    System.out.println("Hello World")// 控制台打印输出

    JOptionPane.showMessageDialog(null, "Hello World")// d出对话框,显示Hello World

   }

  })

  add(jbHello)//把按钮添加到窗体

  

  // 窗体属性的设置

  setLayout(new FlowLayout())// 窗体流式布局, 按添加顺序从左到右排列组件

  setSize(300, 200)// 宽300像素,高200

  setLocationRelativeTo(null)// 窗体放在显示器中间

  setTitle("HelloWord")// 窗体的标题

  setDefaultCloseOperation(EXIT_ON_CLOSE)// 点击窗体右上角的关闭按钮时,结束程序

  setVisible(true)// 窗体可见

 }

 public static void main(String[] args) {

  new ButtonDemo()

 }

}

看明白了吧, addActionListener是关键

进阶版 :加法计算器.  代码稍微长一点,.但注释很多

参考代码如下

import java.awt.*

import java.awt.event.*

import javax.swing.*

//AddFrame继承自JFrame类, 并且实现了ActionListener 接口

public class AddFrame extends JFrame implements ActionListener {

 // 组件

 JTextField jtf1, jtf2, jtf3// 文本框,用于:显示数字

 JButton jbAdd// 按钮,用于:当点击按钮时,计算出加法的结果

 JButton jbClear// 按钮, 用于,清空数字

 public AddFrame() {// 构造方法

  // 初始化组件

  jtf1 = new JTextField(5)// 长度为5的文本框

  JLabel jl = new JLabel("+")//文字标签

  jtf2 = new JTextField(5)

  jtf3 = new JTextField(6)

  jtf3.setEditable(false)

  jbAdd = new JButton("=")

  jbAdd.addActionListener(this)//因为本类已经实现了ActionListener接口,所以添加事件的接收器就是自己(this)

  jbClear = new JButton("清除")

  jbClear.addActionListener(this)

  

  //把组件,添加到窗体

  add(jtf1)

  add(jl)

  add(jtf2)

  add(jbAdd)

  add(jtf3)

  add(jbClear)

  

  // 窗体属性的设置

  setLayout(new FlowLayout())//窗体流式布局, 按添加顺序从左到右排列组件

  setSize(380, 100)// 宽380像素,高100

  setLocationRelativeTo(null)// 窗体放在显示器中间

  setTitle("加法计算器")// 窗体的标题

  setDefaultCloseOperation(EXIT_ON_CLOSE)// 点击窗体右上角的关闭按钮时,结束程序

  setVisible(true)// 窗体可见

 }

 /*

  *  实现ActionListener接口 就必须重写actionPerformed方法

  */

 @Override

 public void actionPerformed(ActionEvent e) {// 当事件产生后,就会执行actionPerformed里的方法

  JButton jbTemp= (JButton) e.getSource()//得到事件源

  

  if(jbTemp==jbAdd) {//如果是从jbAdd产生的事件.那么执行加法 *** 作

   //因为是简单案例,就不判断和处理,用户乱输入字母汉字等情况,导致的异常了

   int x = Integer.parseInt(jtf1.getText())//从文本框1得到字符串,并转化成数字

   int y = Integer.parseInt(jtf2.getText())

   jtf3.setText(x+y+"")//计算2个数的和,并显示在文本框3上

   

  }else if(jbTemp==jbClear) {//如果事件源是 jbClear,那么清除文本框的文字

   

   jtf1.setText("")

   jtf2.setText("")

   jtf3.setText("")

  }

  

 }

 // main方法

 public static void main(String[] args) {

  new AddFrame()//创建一个AddFrame的实例

 }

}

xml文件代码如下:

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Button1" />

<Button

android:id="@+id/button2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Button2" />

四种方法分述如下:

匿名内部类:

public class TestButtonActivity extends Activity {

Button btn1, btn2

Toast tst

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_test_button)

btn1 = (Button) findViewById(R.id.button1)

btn2 = (Button) findViewById(R.id.button2)

btn1.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Toast tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT)

tst.show()

}

})

btn2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Toast tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT)

tst.show()

}

})

}

}

自定义单击事件监听类:

public class TestButtonActivity extends Activity {

Button btn1, btn2

Toast tst

class MyClickListener implements OnClickListener {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.button1:

tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT)

tst.show()

break

case R.id.button2:

tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT)

tst.show()

break

default:

break

}

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_test_button)

btn1 = (Button) findViewById(R.id.button1)

btn2 = (Button) findViewById(R.id.button2)

btn1.setOnClickListener(new MyClickListener())

btn2.setOnClickListener(new MyClickListener())

}

}

Activity继承View.OnClickListener,由Activity实现OnClick(View view)方法,在OnClick(View view)方法中用switch-case对不同id代表的button进行相应的处理

public class TestButtonActivity extends Activity implements OnClickListener {

Button btn1, btn2

Toast tst

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_test_button)

btn1 = (Button) findViewById(R.id.button1)

btn2 = (Button) findViewById(R.id.button2)

btn1.setOnClickListener(this)

btn2.setOnClickListener(this)

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.button1:

tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT)

tst.show()

break

case R.id.button2:

tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT)

tst.show()

break

default:

break

}

}

}

最后一种是我今天看到的一种写法,在XML文件中逗显示指定按钮的onClick属性,这样点击按钮时会利用反射的方式调用对应Activity中的click()方法地

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="onClick"

android:text="Button1" />

<Button

android:id="@+id/button2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="onClick"

android:text="Button2" />

这里在输完android:的时候按下 Alt+/ 会有 onClick 属性的提示, 但输入到 android:onClick=逗 的地方按下 Alt+/ 并没有提示 onClick 选项,让我突然觉得这里好像有点问题。

public class TestButtonActivity extends Activity {

Button btn1, btn2

Toast tst

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_test_button)

}

// 注意 这里没有 @Override 标签

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.button1:

tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT)

tst.show()

break

case R.id.button2:

tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT)

tst.show()

break

default:

break

}

}

}

这种写法整个代码中都不用声明button就可以实现button的单击事件。

jf.addKeyListener(new KeyAdapter()

{

@Override

public void keyPressed(KeyEvent e)

{

char key = e.getKeyChar()

String temp=jta.getText()

if(key.equals('1')){

jta.setText(temp+"1")

}

if(key.equals('2')){

jta.setText(temp+"2")

}

...

}

})

就这样。。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11910240.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存