事件处理^~^

事件源、事件监听器和事件对象之间的协作关系
在这里插入图片描述

事件处理基础

处理按钮点击事件

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


public class ButtonFrame extends JFrame{
    private JPanel buttonPanel;
    private static final int DEFAULT_WIDTH=300;
    private static final int DEFAULT_HEIGHT=200;

    public ButtonFrame(){
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

        //创建按钮
        JButton yellowButton=new JButton("Yellow");
        //可以添加图标
        JButton blueButton=new JButton("Blue",new ImageIcon("haha.gif"));
        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);
    }
    //监听器类,当按钮被点击时,面板的背景颜色设置为指定颜色。
    private class ColorAction implements ActionListener{
        private Color backgroundColor;
        public ColorAction(Color c){
            backgroundColor=c;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            buttonPanel.setBackground(backgroundColor); 
        }
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            ButtonFrame frame=new ButtonFrame();
            frame.setVisible(true);
        });
    }
}

javax.swing.JButton

  • JButton(String label)
  • JButton(Icon icon)
  • JButton(String label, Icon icon)
    构 造 一 个 按 钮。 标 签 可 以 是 常 规 的 文 本, 从 Java SE 1.3 开 始, 也 可 以 是 HTML。 例
    如,“<html><b>Ok</b></html> ”。

java.awt.Container

  • Component add(Component c)
    将组件 c 添加到这个容器中。

简洁地指定监听器

实现一个辅助方法

public void makeButton(String name, Color backgroundColor){
        JButton button=new JButton(name);
        buttonPanel.add(button);
        button.addActionListener(event->{
            buttonPanel.setBackground(backgroundColor);
        });
    }

java.awt.event.ActionEvent

  • String getActionCommand()
    返回与这个动作事件关联的命令字符串。 如果这个动作事件源自一个按钮, 命令字符
    串就等于按钮标签, 除非已经用 setActionCommand 方法改变了命令字符串。

java.beans.EventHandler

  • static <T> T create(class<T> listenerInterface, Object target, String action)
  • static <T> T create(class<T> listenerInterface, Object target, String action, String eventProperty)
  • static <T> T create(class<T> listenerInterface, Object target, String action, String eventProperty, String listenerMethod)
    构造实现给定接 n 的一个代理类的对象。 接口的指定方法或所有方法会在目标对象上执行给定的动作。

java.util.EventObject

  • Object getSource()
    返回发生这个事件的对象的一个引用。

改变观感

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

//带有按钮面板的框架,用于更改外观
public class plafFrame extends JFrame{
    private JPanel buttonPanel;
    public plafFrame(){
        UIManager.LookAndFeelInfo[] infos =UIManager.getInstalledLookAndFeels();
        for(UIManager.LookAndFeelInfo info:infos){
            makeButton(info.getName(),info.getClassName());
        }
        add(buttonPanel);
        pack();
    }
    private void makeButton(String name,String className){
        //将按钮添加到面板
        JButton button=new JButton(name);
        buttonPanel.add(button);
        //设置按钮操作
        button.addActionListener(event->{
            try {
                UIManager.setLookAndFeel(className);
                SwingUtilities.updateComponentTreeUI(this);
                pack();
            } catch (Exception e) {
                //TODO: handle exception
                e.printStackTrace();
            }
        });
    }
}

javax.swing.UIManager

  • static UIManager.LookAndFeelInfo[] getInstalledLookAndFeels()
    获得一个用于描述已安装的观感实现的对象数组。
  • static setLookAndFeel(String className)
    利用给定的类名设置当前的观感。 例如, javax.swing.plaf.metal.MetalLookAndFeel

javax.swing.UIManager.LookAndFeelInfo

  • String getName()
    返回观感的显示名称
  • String getClassName()
    返回观感实现类的名称

适配器类

java.awt.event.WindowListener

  • void windowOpened(WindowEvent e)
    窗口打开后调用这个方法
  • void windowClosing(WindowEvent e)
    在用户发出窗口管理器命令关闭窗口时调用这个方法。需要注意的是,仅当调用 hide
    或 dispose 方法后窗口才能够关闭。
  • void windowClosed(WindowEvent e)
    窗口关闭后调用这个方法。
  • void windowIconified(WIndowEvent e)
    窗口图标化后调用这个方法
  • void windowDeiconified(WindowEvent e)
    窗口非图标化后调用这个方法
  • void windowActivated(WindowEvent e)
    激活窗口后调用这个方法。只有框架或对话框可以被激活。通常,窗口管理器会对活
    动窗口进行修饰,比如,髙亮度标题栏
  • void windowDeactivated(WindowEvent e)
    窗口变为未激活状态后调用这个方法

java.awt.event.WindowStateListener

  • void windowStateChanged(WindowEvent e)
    窗口被最大化、 图标化或恢复为正常大小时调用这个方法。

java.awt.event.WindowEvent

  • int getNewState()
  • int getOldState()
    返回窗口状态改变事件中窗口的新、 旧状态。 返回的整型数值是下列数值之一:
    Frame.NORMAL
    Frame.ICONIFIED
    Frame.MAXIMIZED_HORIZ
    Frame.MAXIMIZED_VERT
    Frame.MAXIMIZED_BOTH

动作

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

import org.w3c.dom.events.Event;


public class ActionFrame extends JFrame{
    private JPanel buttonPanel;
    private static final int DEFAULT_WIDTH=300;
    private static final int DEFAULT_HEIGHT=200;
    public ActionFrame(){
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        buttonPanel =new JPanel();
        //定义动作
        Action yellowAction=new ColorAction("Yellow",new ImageIcon(""),Color.YELLOW);
        Action blueAction=new ColorAction("Blue",new ImageIcon(""),Color.BLUE);
        Action redAction=new ColorAction("Red",new ImageIcon(""),Color.RED);
        //为这些动作添加按钮
        buttonPanel.add(new JButton(yellowAction));
        buttonPanel.add(new JButton(blueAction));
        buttonPanel.add(new JButton(redAction));
        //将面板添加到框架中
        add(buttonPanel);
        //将Y、B、R键和名称关联
        InputMap imap=buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        imap.put(KeyStroke.getKeyStroke("ctrl Y"),"panel.yellow");
        imap.put(KeyStroke.getKeyStroke("ctrl B"),"panel.blue");
        imap.put(KeyStroke.getKeyStroke("ctrl R"),"panel.red");
        //将名字和动作关联
        ActionMap amap=buttonPanel.getActionMap();
        amap.put("panel.yellow",yellowAction);
        amap.put("panel.blue",blueAction);
        amap.put("panel.red",redAction);
        
    }
    
    public class ColorAction extends AbstractAction{
        public ColorAction(String name,Icon icon, Color c){
            putValue(Action.NAME,name);
            putValue(Action.SMALL_ICON, icon);
            putValue(Action.SHORT_DESCRIPTION, "Set panel color to "+name.toLowerCase());
            putValue("color", c);
        }
        public void actionPerformed(ActionEvent event){
            Color c=(Color)getValue("color");
            buttonPanel.setBackground(c);
        }
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            ActionFrame frame=new ActionFrame();
            frame.setVisible(true);
        });
    }
}

javax.swing.Action

  • boolean isEnabled()
  • void setEnabled(boolean b)
    ** 获得或设置这个动作的enabled属性**
  • void putValue(String key,Object value)
    将名/值对放置在动作对象内。
  • Object getVlue(String key)
    ** 返回被存储的名/值对的值**

java.swing.KeyStroke

  • static KeyStroke getKeyStroke(String description)
    根据一个便于人们阅读的说明创建一个按键(由空格分隔的字符串序列)。这个说明以
    0 个或多个修饰符 shift control Ctrl meta alt altGraph 开始, 以由 typed 和单个字符构成
    的字符串 (例如:“ typeda ” )或者一个可选的事件说明符 ( pressed 默认, 或 released )
    紧跟一个键码结束。 以 VK_前缀开始的键码应该对应一个 KeyEvent 常量, 例如,
    “ INSERT ” 对应 KeyEvent.VKJNSERTo

java.swing.JComponent

  • ActionMap getActionMap()
    **返回关联动作映射键(可以是任意的对象)和动作对象的映射。
  • InputMap getInputMap(int flag)
    获得将按键映射到动作键的输入映射。

鼠标事件

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


public class MouseDemo{
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame frame=new MouseFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
            frame.setVisible(true);
        });
    }
}
//用鼠标操作添加或删除正方形的组件
class MouseFrame extends JFrame{
    
    public MouseFrame(){
        add(new MouseComponent());
        pack();
    }
}
class MouseComponent extends JComponent{
	private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    private static final int SIDELENGTH = 10;
    private ArrayList<Rectangle2D> squares;
    private Rectangle2D current; //矩形包含光标
    public MouseComponent(){
    	squares = new ArrayList<>();
    	current = null;
    	addMouseListener(new MouseHandler());   
    	addMouseMotionListener(new MouseMotionHandler()); 
    }
 
    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }   
 
    public void paintComponent(Graphics g){  
        //画出所有矩形   
    	Graphics2D g2 = (Graphics2D) g;      
    	for (Rectangle2D r : squares)        
    		g2.draw(r);
    }
    //查找包含点的第一个正方形,定义p为一个点,返回第一个包含p的正方形
    public Rectangle2D find(Point2D p){     
    	for (Rectangle2D r : squares){       
    		if (r.contains(p)) return r;     
    	}      
    	return null;   
    }
    //向集合中添加一个正方形
    public void add(Point2D p){      
    	double x = p.getX();     
    	double y = p.getY();   
    	current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);      
    	squares.add(current);     
    	repaint();  
    }
     //从集合中删除一个正方形,参数s为删除的正方形
    public void remove(Rectangle2D s){     
    	if (s == null) return;     
    	if (s == current) current = null;     
    	squares.remove(s); 
    	repaint(); 
    }
   
    private class MouseHandler extends MouseAdapter{   
        //如果光标不在正方形内,添加一个新的正方形
    	public void mousePressed(MouseEvent event){    //鼠标按下时调用        
    		current = find(event.getPoint());     
    		if (current == null) add(event.getPoint());    
    	}
        //如果双击则删除当前的正方形
    	public void mouseClicked(MouseEvent event){   //鼠标点击时调用,点击两次则移除矩形    
    		current = find(event.getPoint());    
    		if (current != null && event.getClickCount() >= 2) remove(current);    
    	} 
    }
 
    private class MouseMotionHandler implements MouseMotionListener{   
         //如果光标在矩形内部,将其设为十字准线
    	public void mouseMoved(MouseEvent event){    //鼠标移动时调用
    		if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());         
    		else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));     
    	}
    
    	public void mouseDragged(MouseEvent event){  //鼠标按住拖动时调用      
    		if (current != null){           
    			int x = event.getX();           
    			int y = event.getY();    
                //拖动当前矩形以使其居中位于(x,y)     
    			current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);           
    			repaint();         
    		}      
    	} 
    }   
}

java.awt.event.MouseEvent

  • int getX()
  • int getY()
  • Point getPoint()
    返回事件发生时,事件源组件左上角的坐标x(水平)和y(竖直),或点信息
  • int getClickCount()
    返回与事件关联的鼠标连击次数(“ 连击 ” 所指定的时间间隔与具体系统有关 )

java.awt.event.InputEvent

  • int get ModifiersEx()
    返回事件扩展的或“ 按下”(down ) 的修饰符。 使用下面的掩码值检测返回值:
    BUTTON1_DOWN_MASK
    BUTTON2_DOWN_MASK
    BUTTON3_DOWN_MASK
    SHIFT_DOWN_MASK
    CTRL_DOWN_MASK
    ALT_DOWN_MASK
    ALT_GRAPH_DOWN_MASK
    META_DOWN_MASK

  • static String getModifiersExText(int modifiers)
    返回用给定标志集描述的扩展或“ 按下 ” ( down ) 的修饰符字符串, 例如“ Shift+ Buttonl ”

java.awt.Tookit

  • public Cursor createCustomCursor(Image image,Point hotSpot,String name)

java.awt.Component

  • public void setCursor(Cursor cursor)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能饮一杯吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值