博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java之事件处理
阅读量:5159 次
发布时间:2019-06-13

本文共 12224 字,大约阅读时间需要 40 分钟。

监听器

ActionListener接口 ——通常用自己创建的新类implements接口

建议使用匿名内部类实现,因为内部类可以访问类内的变量,而匿名类可以大大简化代码,不需要构造函数。

实例:处理按钮点击事件

1 package button; 2  3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6  7 /** 8  * A frame with a button panel 9  */10 public class ButtonFrame extends JFrame11 {12    private JPanel buttonPanel;13    private static final int DEFAULT_WIDTH = 300;14    private static final int DEFAULT_HEIGHT = 200;15 16    public ButtonFrame()17    {      18       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);19 20       // create buttons21       JButton yellowButton = new JButton("Yellow");22       JButton blueButton = new JButton("Blue");23       JButton redButton = new JButton("Red");24 25       buttonPanel = new JPanel();26 27       // add buttons to panel28       buttonPanel.add(yellowButton);29       buttonPanel.add(blueButton);30       buttonPanel.add(redButton);31 32       // add panel to frame33       add(buttonPanel);34 35       // create button actions36       ColorAction yellowAction = new ColorAction(Color.YELLOW);37       ColorAction blueAction = new ColorAction(Color.BLUE);38       ColorAction redAction = new ColorAction(Color.RED);39 40       // associate actions with buttons41       yellowButton.addActionListener(yellowAction);42       blueButton.addActionListener(blueAction);43       redButton.addActionListener(redAction);44    }45 46    /**47     * An action listener that sets the panel's background color.48     */49    private class ColorAction implements ActionListener50    {51       private Color backgroundColor;52 53       public ColorAction(Color c)54       {55          backgroundColor = c;56       }57 58       public void actionPerformed(ActionEvent event)59       {60          buttonPanel.setBackground(backgroundColor);61       }62    }63 }
View Code

实例:改变观感

1 package plaf; 2  3 import java.awt.event.*; 4 import javax.swing.*; 5  6 /** 7  * A frame with a button panel for changing look and feel 8  */ 9 public class PlafFrame extends JFrame10 {11    private JPanel buttonPanel;12    public PlafFrame()13    {14       buttonPanel = new JPanel();15       16       UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();17       for (UIManager.LookAndFeelInfo info : infos)18          makeButton(info.getName(), info.getClassName());19       20       add(buttonPanel);21       pack();22    }23 24    /**25     * Makes a button to change the pluggable look and feel.26     * @param name the button name27     * @param plafName the name of the look and feel class28     */29    void makeButton(String name, final String plafName)30    {31       // add button to panel32 33       JButton button = new JButton(name);34       buttonPanel.add(button);35 36       // set button action37 38       button.addActionListener(new ActionListener()39          {40             public void actionPerformed(ActionEvent event)41             {42                // button action: switch to the new look and feel43                try44                {45                   UIManager.setLookAndFeel(plafName);46                   SwingUtilities.updateComponentTreeUI(PlafFrame.this);47                   pack();48                }49                catch (Exception e)50                {51                   e.printStackTrace();52                }53             }54          });55    }  56 }
View Code

适配器

由WindowAdapter类实现的WindowListener接口中的众多方法

由于ActionListener接口只有一个方法所以不需要提供适配器类

动作

Action接口 由AbstractAction类实现 包含以下方法:

void actionPerformed(ActionEvent event); //扩展于ActionListener接口void setEnabled(boolean b); //启用或禁用这个这个动作boolean isEnabled(); //检查动作是否启用void putValue(String key, Object value); //存储名/值对到动作对象中Object getvalue(String key); //检索动作对象中的任意名/值对void addPropertyChangeListener(PropertyChangeListener listener);void remove PropertyChangeListener(PropertyChangeListener listener); //最后两个方法能够让其他对象在动作对象的属性发生变化时得到通告

 

预定义的动作表名称
名称
NAME 动作名称,显示在按钮和菜单上
SMALL_ICON 存储小图标的地方;显示在按钮、菜单项或工具栏中
SHORT_DESCRIPTION 图标的简要说明;显示在工具提示中
LONG_DESCRIPTION 图标的详细说明;显示在在线帮助中。没有Swing组件使用这个值
MNEMONIC_KEY 快捷键缩写;显示在菜单项中
ACCELERATOR_KEY 存储加速击键的地方;Swing组件不使用这个值
ACTION_COMMAND_KEY 历史遗留;仅在旧版本的registerKeyboardAction方法中使用
DEFAULT 常用的综合属性;Swing组件不使用这个值

 

 

 

 

 

 

 

 

键盘事件

KeyStroke类将击键与动作相关联

每个组件可以有三个输入映射InputMap和一个动作映射ActionMap 用get获取 put改变

 

输入映射条件
标志 激活动作
WHEN_FOCUSED 当这个组件拥有键盘焦点时
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 当这个组件包含了拥有键盘焦点的组件时
WHEN_IN_FOCUSED_WINDOW 当这个组件被包含在一个拥有键盘焦点组件的窗口中时

 

 

 

 

动作实例:

1 package action; 2  3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6  7 /** 8  * A frame with a panel that demonstrates color change actions. 9  */10 public class ActionFrame extends JFrame11 {12    private JPanel buttonPanel;13    private static final int DEFAULT_WIDTH = 300;14    private static final int DEFAULT_HEIGHT = 200;15 16    public ActionFrame()17    {18       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);19 20       buttonPanel = new JPanel();21 22       // define actions23       Action yellowAction = new ColorAction("Yellow", new ImageIcon("yellow-ball.gif"),24             Color.YELLOW);25       Action blueAction = new ColorAction("Blue", new ImageIcon("blue-ball.gif"), Color.BLUE);26       Action redAction = new ColorAction("Red", new ImageIcon("red-ball.gif"), Color.RED);27 28       // add buttons for these actions29       buttonPanel.add(new JButton(yellowAction));30       buttonPanel.add(new JButton(blueAction));31       buttonPanel.add(new JButton(redAction));32 33       // add panel to frame34       add(buttonPanel);35 36       // associate the Y, B, and R keys with names37       InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);38       imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");39       imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");40       imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");41 42       // associate the names with actions43       ActionMap amap = buttonPanel.getActionMap();44       amap.put("panel.yellow", yellowAction);45       amap.put("panel.blue", blueAction);46       amap.put("panel.red", redAction);47    }48    49    public class ColorAction extends AbstractAction50    {51       /**52        * Constructs a color action.53        * @param name the name to show on the button54        * @param icon the icon to display on the button55        * @param c the background color56        */57       public ColorAction(String name, Icon icon, Color c)58       {59          putValue(Action.NAME, name);60          putValue(Action.SMALL_ICON, icon);61          putValue(Action.SHORT_DESCRIPTION, "Set panel color to " + name.toLowerCase());62          putValue("color", c);63       }64 65       public void actionPerformed(ActionEvent event)66       {67          Color c = (Color) getValue("color");68          buttonPanel.setBackground(c);69       }70    }71 }
View Code

 

鼠标事件

如果只希望用户点击按钮或菜单,则不需要显式地处理鼠标事件。然而,如果希望用户使用鼠标画图,就需要捕获鼠标移动点击和拖动事件。

鼠标点击事件:

MouseHandler类 extends MouseAdapter类 implement MouseListener接口

鼠标第一次被按下时,调用mouse Pressed方法;鼠标被释放时调用mouseReleased方法;最后调用mouseClicked方法。如果只对最终的点击事件感兴趣,可以忽略前两个方法。

扩展——getModifiersEx方法能够准确地报告鼠标事件的鼠标按钮和键盘修饰符。有下列掩码

  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

鼠标移动与拖动事件:

MouseMotionHandler类 implement MouseMotionListener接口

鼠标移动调用mouseMoved方法,鼠标拖动调用mouseDragged方法。

鼠标光标可以参考Cursor类的getPredefinedCursor方法。

1 package mouse;  2   3 import java.awt.*;  4 import java.awt.event.*;  5 import java.awt.geom.*;  6 import java.util.*;  7 import javax.swing.*;  8   9 /** 10  * A component with mouse operations for adding and removing squares. 11  */ 12 public class MouseComponent extends JComponent 13 { 14    private static final int DEFAULT_WIDTH = 300; 15    private static final int DEFAULT_HEIGHT = 200; 16  17    private static final int SIDELENGTH = 10; 18    private ArrayList
squares; 19 private Rectangle2D current; // the square containing the mouse cursor 20 21 public MouseComponent() 22 { 23 squares = new ArrayList<>(); 24 current = null; 25 26 addMouseListener(new MouseHandler()); 27 addMouseMotionListener(new MouseMotionHandler()); 28 } 29 30 public void paintComponent(Graphics g) 31 { 32 Graphics2D g2 = (Graphics2D) g; 33 34 // draw all squares 35 for (Rectangle2D r : squares) 36 g2.draw(r); 37 } 38 39 /** 40 * Finds the first square containing a point. 41 * @param p a point 42 * @return the first square that contains p 43 */ 44 public Rectangle2D find(Point2D p) 45 { 46 for (Rectangle2D r : squares) 47 { 48 if (r.contains(p)) return r; 49 } 50 return null; 51 } 52 53 /** 54 * Adds a square to the collection. 55 * @param p the center of the square 56 */ 57 public void add(Point2D p) 58 { 59 double x = p.getX(); 60 double y = p.getY(); 61 62 current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, 63 SIDELENGTH); 64 squares.add(current); 65 repaint(); 66 } 67 68 /** 69 * Removes a square from the collection. 70 * @param s the square to remove 71 */ 72 public void remove(Rectangle2D s) 73 { 74 if (s == null) return; 75 if (s == current) current = null; 76 squares.remove(s); 77 repaint(); 78 } 79 80 private class MouseHandler extends MouseAdapter 81 { 82 public void mousePressed(MouseEvent event) 83 { 84 // add a new square if the cursor isn't inside a square 85 current = find(event.getPoint()); 86 if (current == null) add(event.getPoint()); 87 } 88 89 public void mouseClicked(MouseEvent event) 90 { 91 // remove the current square if double clicked 92 current = find(event.getPoint()); 93 if (current != null && event.getClickCount() >= 2) remove(current); 94 } 95 } 96 97 private class MouseMotionHandler implements MouseMotionListener 98 { 99 public void mouseMoved(MouseEvent event)100 {101 // set the mouse cursor to cross hairs if it is inside102 // a rectangle103 104 if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());105 else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));106 }107 108 public void mouseDragged(MouseEvent event)109 {110 if (current != null)111 {112 int x = event.getX();113 int y = event.getY();114 115 // drag the current rectangle to center it at (x, y)116 current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);117 repaint();118 }119 }120 }121 122 public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }123 }
View Code

 

AWT事件继承层次

 AWT事件类的继承关系

事件处理总结
事件 接口 方法 访问方法 事件源
语义事件类 ActionEvent ActionListener actionPerformed

getActionCommand

getModifiers

AbstractButton

JComboBox

JTextField

Timer

AdjustmentEvent AdjustmentListener adjustmentValueChanged

getAdjustable

getAdjustmentType

getValue

JScrollbar
ItemEvent ItemListener itemStateChanged

getIten

getItemSelectable

getStateChange

AbstractButton

JComboBox

低级事件类 FocusEvent FocusListener

focusGained

focusLost

isTemporary Component
KeyEvent KeyListener

keyPressed

keyReleased

keyTyped

getKeyChar

getKeyCode

getKeyModifiersText

getKeyText

isActionKey

Component
MouseEvent MouseListener

mousePressed

mouseReleased

mouseEntered

mouseExited

mouseClicked

getClickCount

getX

getY

getPoint

translatePoint

Component
MouseEvent MouseMotionListener

mouseDragged

mouseMoved

  Component
MouseWheelEvent MouseWheelListener mouseWheelMoved

getWheelRotation

getScrollAmount

Component
WindowEvent WindowListener

windowClosing

windowOpened

windowIconified

windowDeiconified

windowClosed

windowActivated

windowDeactivated

getWindow

Window
WindowEvent WindowFocusListener

windowGainFocus

windowLostFocus

getOppositeWindow Window
WindowEvent WindowStateListener windowStateChanged

getOldState

getNewState

Window

转载于:https://www.cnblogs.com/fr-ruiyang/p/8796837.html

你可能感兴趣的文章
微信开发之消息接收--文本消息(五)
查看>>
Nginx+uWSGI+Django环境配置
查看>>
黑盒白盒测试方法
查看>>
《基础排序算法练习题》
查看>>
类Lisp解释器JavaScript实现
查看>>
关于字符串查找 charindex ,Patindex 还有一个like
查看>>
setState立即更新的两种写法
查看>>
冒泡、捕获的问题
查看>>
linux下压缩与解压
查看>>
C语言学习(35)
查看>>
Struts2 中的值栈的理解
查看>>
daydayup1 codeforces141c
查看>>
JMS 的PTP模型
查看>>
通过Cookie跳过登录验证码【限cookie不失效有用】
查看>>
Fragstats 3.3无法计算拼块面积的原因
查看>>
数据库设计感悟
查看>>
CSS实现细线表格
查看>>
服务器架构
查看>>
Beta冲刺总结
查看>>
jdk8中map新增的merge方法介绍
查看>>