鼠標事件的事件源往往與容器相關(guān),當(dāng)鼠標進入容器、離開容器,或者在容器中單擊鼠標、拖動鼠標時都會發(fā)生鼠標事件。java語言為處理鼠標事件提供兩個接口:MouseListener,MouseMotionListener接口。
MouseListener接口
MouseListener接口能處理5種鼠標事件:按下鼠標,釋放鼠標,點擊鼠標、鼠標進入、鼠標退出。相應(yīng)的方法有:
(1) getX():鼠標的X坐標
(2) getY():鼠標的Y坐標
(3) getModifiers():獲取鼠標的左鍵或右鍵。
(4) getClickCount():鼠標被點擊的次數(shù)。
(5) getSource():獲取發(fā)生鼠標的事件源。
(6) addMouseListener(監(jiān)視器):加放監(jiān)視器。
(7) removeMouseListener(監(jiān)視器):移去監(jiān)視器。
要實現(xiàn)的MouseListener接口的方法有:
(1) mousePressed(MouseEvent e);
(2) mouseReleased(MouseEvent e);
(3) mouseEntered(MouseEvent e);
(4) mouseExited(MouseEvent e);
(5) mouseClicked(MouseEvent e);
【例】小應(yīng)用程序設(shè)置了一個文本區(qū),用于記錄一系列鼠標事件。當(dāng)鼠標進入小應(yīng)用程序窗口時,文本區(qū)顯示“鼠標進來”;當(dāng)鼠標離開 窗口時,文本區(qū)顯示“鼠標走開”;當(dāng)鼠標被按下時,文本區(qū)顯示“鼠標按下”,當(dāng)鼠標被雙擊時,文本區(qū)顯示“鼠標雙擊”;并顯示鼠標的坐標。程序還顯示一個紅色的圓,當(dāng)點擊鼠標時,圓的半徑會不斷地變大。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import java.applet.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyPanel extends JPanel{ public void print( int r){ Graphics g = getGraphics(); g.clearRect( 0 , 0 , this .getWidth(), this .getHeight()); g.setColor(Color.red); g.fillOval( 10 , 10 ,r,r); } } class MyWindow extends JFrame implements MouseListener{ JTextArea text; MyPanel panel; int x,y,r = 10 ; int mouseFlg= 0 ; static String mouseStates[]={ "鼠標鍵按下" , "鼠標松開" , "鼠標進來" , "鼠標走開" , "鼠標雙擊" }; MyWindow(String s){ super (s); Container con = this .getContentPane(); con.setLayout( new GridLayout( 2 , 1 )); this .setSize( 200 , 300 ); this .setLocation( 100 , 100 ); panel = new MyPanel(); con.add(panel); text = new JTextArea( 10 , 20 ); text.setBackground(Color.blue); con.add(text); addMouseListener( this ); this .setVisible( true ); this .pack(); } public void paint(Graphics g){ r = r+ 4 ; if (r> 80 ){ r= 10 ; } text.append(mouseStates[mouseFlg]+ "了,位置是:" +x+ "," +y+ "\n" ); panel.print(r); } public void mousePressed(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 0 ; repaint(); } public void mouseRelease(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 1 ; repaint(); } public void mouseEntered(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 2 ; repaint(); } public void mouseExited(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 3 ; repaint(); } public void mouseClicked(MouseEvent e){ if (e.getClickCount()== 2 ){ x = e.getX(); y = e.getY(); mouseFlg = 4 ; repaint(); } else {} } } public class Example6_8 extends Applet{ public void init(){ MyWindow myWnd = new MyWindow( "鼠標事件示意程序" ); } } |
任何組件上都可以發(fā)生鼠標事件:鼠標進入、鼠標退出、按下鼠標等。例如,在上述程序中添加一個按鈕,并給按鈕對象添加鼠標監(jiān)視器,將上述程序中的init()方法修改成如下形式,即能示意按鈕上的所有鼠標事件。
1
2
3
4
5
6
7
8
9
|
JButton button; public void init(){ button = new JButton(“按鈕也能發(fā)生鼠標事件”); r = 10 ; text = new JTextArea( 15 , 20 ); add(button); add(text); button.addMouseListener( this ); } |
如果程序希望進一步知道按下或點擊的是鼠標左鍵或右鍵,鼠標的左鍵或右鍵可用InputEvent類中的常量BUTTON1_MASK和BUTTON3_MASK來判定。例如,以下表達式判斷是否按下或點擊了鼠標右鍵:
1
|
e.getModifiers()==InputEvent. BUTTON3_MASK |
MouseMotionListener接口
MouseMotionListener接口處理拖動鼠標和鼠標移動兩種事件。
注冊監(jiān)視器的方法是:
addMouseMotionListener(監(jiān)視器)
要實現(xiàn)的的接口方法有兩個:
(1) mouseDragged(MouseEvent e)
(2) mouseMoved(MouseEvent e)
【例】一個滾動條與顯示窗口同步變化的應(yīng)用程序。窗口有一個方塊,用鼠標拖運方塊,或用鼠標點擊窗口,方塊改變顯示位置,相應(yīng)水平和垂直滾動條的滑塊也會改變它們在滾動條中的位置。反之,移動滾動條的滑塊,方塊在窗口中的顯示位置也會改變。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyWindow extends JFrame{ public MyWindow(String s){ super (s); Container con = this .getContentPane(); con.setLayout( new BorderLayout()); this .setLocation( 100 , 100 ); JScrollBar xAxis = new JScrollBar(JScrollBar.HORIZONTAL, 50 , 1 , 0 , 100 ); jScrollBar yAxis = new jScrollBar(JScrollBar.VERTICAL, 50 , 1 , 0 , 100 ); MyListener listener = new MyListener(xAxis,yAxis, 238 , 118 ); Jpanel scrolledCanvas = new JPanel(); scrolledCanvas.setLayout( new BorderLayout()); scrolledCanvas.add(listener,BorderLayout.CENTER); scrolledCanvas.add(xAix,BorderLayout.SOUTH); scrolledCanvas.add(yAix,BorderLayout.EAST); con.add(scrolledCanvas,BorderLayout.NORTH); this .setVisible( true ); this .pack(); } public Dimension getPreferredSize(){ return new Dimension( 500 , 300 ); } } class MyListener extends JComponent implements MouseListener, MouseMotionListener,AdjustmentListener{ private int x,y; private JScrollBar xScrollBar; private JScrollBar yScrollBar; private void updateScrollBars( int x, int y){ int d; d = ( int )((( float )x/( float )getSize().width)* 100.0 ); xScrollBar.setValue(d); d = ( int )((( float )y/( float )getSize().height)* 100.0 ); yScrollBar.setValue(d); } public MyListener(JScrollBar xaxis,JScrollBar yaxis, int x0, int y0){ xScrollBar =xaxis; yScrollBar =yaxis; x = x0; y=y0; xScrollBar.addAdjustmentListener( this ); yScrollBar.addAdjustmentListener( this ); this .addMouseListener( this ); this .addMouseMotionListener( this ); } public void paint(Graphics g){ g.setColor(getBackground()); Dimension size = getSize(); g.fillRect( 0 , 0 ,size.width,size.height); g.setColor(Color.blue); g.fillRect(x,y, 50 , 50 ); } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseRelease(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void mousePressed(MouseEvent e){ x = e.getX(); y = e.getY(); updateScrollBars(x,y); repaint(); } public void mouseDragged(MouseEvent e){ x = e.getX(); y = e.getY(); updateScrollBars(x,y); repaint(); } public void adjustmentValueChanged(AdjustmentEvent e){ if (e.getSource()==xScrollBar) x=( int )(( float )(xScrollBar.getValue()/ 100.0 )*getSize().width); else if (e.getSource()==yScrollBar) y = ( int )(( float )(yScrollBar.getValue()/ 100.0 )*getSize().height); repaint(); } } public class Example6_9{ public static void main(){ MyWindow myWindow = new MyWindow( "滾動條示意程序" ); } } |
上述例子中,如果只要求通過滑動滑塊,改變內(nèi)容的顯示位置,可以簡單地使用滾動面板JScrollPane。如果是這樣,關(guān)于滾動條的創(chuàng)建和控制都可以免去,直接由JScrollPane內(nèi)部實現(xiàn)。參見以下修改后的MyWindow的定義:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class MyWindow extends JFrame{ public MyWindow(String s){ super (s); Container con = this .getContentPane(); con.setLayout( new BorderLayout()); this .setLocaltion( 100 , 100 ); MyListener listener = new MyListener(); listener.setPreferredSize( new Dimension( 700 , 700 )); JScrollPane scrolledCanvas = new JScrollPane(listener); this .add(scrolledCanvas,BorderLayout.CENTER); this .setVisible( true ); this .pack(); } public Dimension getPreferredSize(){ return new Dimension( 400 , 400 ); } } |
鼠標指針形狀也能由程序控制 ,setCursor()方法能設(shè)置鼠標指針形狀。例如,代碼setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。