Java中为按钮添加监听器(事件处理)四种形式总结

      以下的示例程序是要在一个面板中添加三个按钮,并分别添加三个监听器对象用来作为按钮的动作监听器,当点击不同的按钮时使得面板的背景色变成相应的颜色:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonFrame{
	public static void main(String[] args){
	    EventQueue.invokeLater(() -> {
    	        JFrame frame= new CreatButtonFrame();
                frame.setTitle("ButtonTest");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);});	
	}
}

class CreatButtonFrame extends JFrame{
	private JPanel buttonPanel;
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	public CreatButtonFrame(){
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
	    JButton yellowButton = new JButton("Yellow");
	    JButton blueButton = new JButton("Blue");
	    JButton redButton = new JButton("Red");
	    buttonPanel = new JPanel();
	    buttonPanel.add(yellowButton);
	    buttonPanel.add(blueButton);
	    buttonPanel.add(redButton);
	    add(buttonPanel);
	    ColorAction yellowAction = new ColorAction(Color.YELLOW);
	    ColorAction blueAction = new ColorAction(Color.BLUE);
	    ColorAction redAction = new ColorAction(Color.RED);
	    yellowButton.addActionListener(yellowAction);
	    blueButton.addActionListener(blueAction);
	    redButton.addActionListener(redAction);
	}
	
	class ColorAction implements ActionListener{
		private Color backgroundColor;
		public ColorAction(Color c){
			backgroundColor = c;
		}
		public void actionPerformed(ActionEvent event){
			buttonPanel.setBackground(backgroundColor);
		}
	}
}

      以上程序没必要单独为事件监听器定义一个类并构造类的3个对象,因此,可以使用lambda表达式简化如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonFrame{
	public static void main(String[] args){
		EventQueue.invokeLater(() -> {
    	JFrame frame= new CreatButtonFrame();
        frame.setTitle("ButtonTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);});	
	}
}

class CreatButtonFrame extends JFrame{
	private JPanel buttonPanel;
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	public CreatButtonFrame(){
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		buttonPanel = new JPanel();
		makeButton("yellow",Color.yellow);
		makeButton("blue",Color.blue);
		makeButton("red",Color.red);
		add(buttonPanel);
	}
	public void makeButton(String name, Color backgroundColor) {
	    JButton button = new JButton(name);
	    buttonPanel.add(button);
	    button.addActionListener(event ->
	    	buttonPanel.setBackground(backgroundColor));
	}
}

      此外,当我们不习惯于使用lambda表达式,而是更喜欢创建实现了ActionListener接口的事件源容器,然后这个容器再设置自身作为监听器,则可以修改为如下的形式:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonFrame{
	public static void main(String[] args){
		EventQueue.invokeLater(() -> {
    	JFrame frame= new CreatButtonFrame();
        frame.setTitle("ButtonTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);});	
	}
}

class CreatButtonFrame extends JFrame implements ActionListener{
	private JPanel buttonPanel;
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	private Button yellowButton,blueButton,redButton;
	public CreatButtonFrame(){
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		buttonPanel = new JPanel();
		yellowButton=new Button("yellow");
		blueButton=new Button("blue");
		redButton=new Button("red");
		yellowButton.addActionListener(this);
		blueButton.addActionListener(this);
		redButton.addActionListener(this);
		buttonPanel.add(yellowButton);
		buttonPanel.add(blueButton);
		buttonPanel.add(redButton);
		add(buttonPanel);
	}
	public void actionPerformed(ActionEvent event) {
		Object source=event.getSource();
		if(source==yellowButton) {
			buttonPanel.setBackground(Color.yellow);
		}else if(source==blueButton) {
			buttonPanel.setBackground(Color.blue);
		}else if(source==redButton){
			buttonPanel.setBackground(Color.red);
		}
	}
}

      此外,还可以采用一种机制指定事件监听器,其事件处理器包含一个方法调用。例如当一个按钮监听器需要执行调用:

  frame.doMethod();

可以通过EventHandler类创建一个监听器:

  EventHandler.create(ActionListener.class,frame,"doMethod")

但利用lambda表达式更容易实现:

  event -> frame.doMethod();

因此,这种通过EventHandler类创建监听器的方法不常用。该方法的完整示例如下,该示例在点击按钮“Click Here”后会打印“Hello World!”的消息:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.beans.*; 
public class Buttonhand extends JFrame{
	public static void main(String args[]){
		JFrame frame = new Buttonhand(); 
		frame.setSize(300, 400); 
		frame.setVisible(true); 	
	}
	public Buttonhand(){
		super("事件处理"); 
		setDefaultCloseOperation(EXIT_ON_CLOSE); 
		JButton button = new JButton("Click Here"); 
		Container contentPane = getContentPane(); 
		contentPane.add(button, BorderLayout.CENTER); 
		button.addActionListener( (ActionListener)EventHandler.create( ActionListener.class, this, "print") ); 
	}
	public void print(){
		System.out.println("Hello World!");	
	} 
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值