JAVA笔记【20131219】

一、低级事件

键盘事件补充:

键盘中有表示动作的键,对应的KeyEvent中isActionKey方法会对是否是动作键进行判断。

动作键有:HOME,END,PAGE UP,PAGE DOWN,UP,DOWN,LEFT,RIGHT,F1~F24,PRINT SCREEN,SCROLL LOCK,CAPS LOCK, 

                    NUM LOCK,PAUSE,INSERT,DELETE,ENTER,BACKSPACE和TAP


鼠标事件:当用户点击鼠标按钮时,将会调用三个监听器方法。按下鼠标时调用mousePressed,鼠标释放时调用mouseReleased最后调用mouseClicked。

MouseEvent事件对象调用getX和getY方法将返回鼠标按下时鼠标指针所在的X和Y坐标。要想区分鼠标的单击、双击和三击,需要调用getClickCount方法。

MouseListener中提供了mouseClicked(鼠标按键在组件上按下并释放时调用),mousePressed(鼠标按键在组件上按下时调用),mouseReleased(鼠标按钮在组件上释放时调用),mouseEntered(鼠标进入到组件上时调用),mouseExited(鼠标离开组件时调用)。

MouseMotionListener中提供了mouseDragged(鼠标按键在组件上按下并拖动时调用),mouseMoved(鼠标光标移动到组件上但无按键按下时调用)。

光标的形状,可以通过调用Cursor类中的getPredefinedCursor方法来获取预先定义的光标,再调用组件的setCursor方法即可设置。当然也可以利用Toolkit类中的createCustomCursor方法自己定义光标样式。

Toolkit tk = Toolkit.getDefaultToolkit();
Image img = tk.getImage("2b.jpg");
Cursor newCursor = tk.createCustomCursor(img,new Point(10,10),"new Cursor");

createCustomCursor方法中第一个参数指向光标图像,第二个参数是光标偏移,第三个参数是光标描述。

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.ArrayList;
public class MouseFrameTest01
{
	public static void main(String[] args)
	{
		MouseFrame sp = new MouseFrame();
		sp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //关闭窗口是操作
		sp.setVisible(true);  //显示组件
		sp.setTitle("MouseWindow"); //标题栏
	}
}

class MouseFrame extends JFrame
{
	public MouseFrame()
	{
		MousePanel mp = new MousePanel();
		setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);  //设置组件宽度和高度
		//setResizable(false);  //设置组件大小是否可调节
		add(mp);
	}
	public static final int DEFAULT_WIDTH = 650;
	public static final int DEFAULT_HEIGHT = 350;
}

class MousePanel extends JPanel
{
	public MousePanel()
	{
		rect2D = new ArrayList<Rectangle2D>();
		MouseListener mousL = new MouseLis();
		MouseMotionListener mouseMl = new MouseMLis();
		addMouseListener(mousL);
		addMouseMotionListener(mouseMl);
		JButton clearB = new JButton("清除");
		add(clearB);
		ActionListener act = new ClActionListener();
		clearB.addActionListener(act);
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D gps2D = (Graphics2D)g ;
		//图形颜色
		gps2D.setPaint(Color.BLUE);
		for(Rectangle2D r2d:rect2D)
		{
			gps2D.draw(r2d);
		}
	}
	
	public void add(Point2D e)
	{
		double x = e.getX();
		double y = e.getY();
		Rectangle2D temp2d = new Rectangle2D.Double(x-side/2,y-side/2,side,side);
		rect2D.add(temp2d);
		repaint();
	}
	
	public void remove(Rectangle2D e)
	{
		if(e==null)
			return;
		else
		{
			rect2D.remove(e);
			currentR2D=null;
		}
		repaint();
	}
	
	public Rectangle2D findR2D(Point2D e)
	{
		for(Rectangle2D r:rect2D)
		{
			if(r.contains(e.getX(),e.getY()))
				return r;
		}
		return null;
	}
	
	class MouseLis extends MouseAdapter
	{
		public void mousePressed(MouseEvent e)
		{
			currentR2D = findR2D(e.getPoint());
			if(currentR2D == null)
			{
				add(e.getPoint());
			}
		}
		
		public void mouseClicked(MouseEvent e)
		{
			if((currentR2D != null)&&(e.getClickCount()>=2))
			{
				remove(currentR2D);
			}
		}
	}

  class MouseMLis extends MouseMotionAdapter 
	{
		public void mouseDragged(MouseEvent e)
		{
			double x = e.getX();
			double y = e.getY();

			if(currentR2D != null)
			{
				currentR2D.setFrame(x-side/2,y-side/2,side,side);
				repaint();
			}
		}
		public void mouseMoved(MouseEvent e)
		{
			currentR2D = findR2D(e.getPoint());
			if(currentR2D != null)
			{
				//newCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
				Toolkit tk = Toolkit.getDefaultToolkit();
        Image img = tk.getImage("2b.jpg");
        newCursor = tk.createCustomCursor(img,new Point(5,5),"new Cursor");
			}
			else
			{
				newCursor = Cursor.getDefaultCursor();
			}
			setCursor(newCursor);
		}
	}
	
	class ClActionListener implements ActionListener 
	{
		public void actionPerformed(ActionEvent event)
		{
			rect2D.clear(); 
			repaint();
		}
	}
	
	private Cursor newCursor;
	private ArrayList<Rectangle2D> rect2D;
	private Rectangle2D currentR2D;
	private static final int side =10;
}

运行结果:



焦点事件:

鼠标可以指向屏幕上的任何一个对象,但使用键盘输入时,必须定位于一个特定的屏幕对象。在任何时候只有一个窗口是活动的。

在一个窗口中,最多只有一个组件拥有焦点。当用户点击另外组件的时候,原组件失去焦点,被点击的组件获得焦点。可以使用TAB在各组件之间切换焦点。

键盘焦点管理器获得

KeyboardFocusManager keyboardManager = KeyboardFocusManager.getCurrentKeyboardFocusManager

获取当前拥有焦点的组件

Component owner = keyboardManager.getFocusOwner();

获取当前拥有焦点的窗口

Window owWin = keyboardManager.getFocusedWindow();

获得当前活动窗口

Window actWin = keyboardManager.getActiveWindow();

组件焦点监听器接口FocusListener,有focusGained(组件获得键盘焦点时调用)和focusLost(组件失去键盘焦点时调用)。

FocusEvent事件中getComponent方法用于报告获得或者失去焦点的组件。isTemporary方法在焦点是临时性失去的时候返回true,例如当由一个窗口切换到另外一个窗口时,组件临时性失去焦点,当切换回来的时候又是原来的组件获得焦点。


窗口焦点事件

窗口焦点事件监听器WindowFocusListener包含了窗口获得焦点windowGainedFocus(WindowEvent e)和窗口失去焦点windowLostFocus(WindowEvent e)

对等物

焦点由一个组件或者窗口转移到另外一个组件或者窗口时,这两个组件或者窗口叫做对等物。

FocusEvent 中getOppositeComponent()方法用于获取对等组件,WindowEvent中getOppositeWindow()方法用于获取对等窗口。

当组件在焦点窗口时,可以调用组件的requestFocusInWindow方法获取焦点,但不能根据该方法的返回值判定是否获取到焦点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值