事件源、事件监听器和事件对象之间的协作关系
事件处理基础
处理按钮点击事件
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)