詳解Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì)
鼠標(biāo)事件的事件源往往與容器相關(guān),當(dāng)鼠標(biāo)進(jìn)入容器、離開(kāi)容器,或者在容器中單擊鼠標(biāo)、拖動(dòng)鼠標(biāo)時(shí)都會(huì)發(fā)生鼠標(biāo)事件。java語(yǔ)言為處理鼠標(biāo)事件提供兩個(gè)接口:MouseListener,MouseMotionListener接口。
MouseListener接口
MouseListener接口能處理5種鼠標(biāo)事件:按下鼠標(biāo),釋放鼠標(biāo),點(diǎn)擊鼠標(biāo)、鼠標(biāo)進(jìn)入、鼠標(biāo)退出。相應(yīng)的方法有:
(1) getX():鼠標(biāo)的X坐標(biāo)
(2) getY():鼠標(biāo)的Y坐標(biāo)
(3) getModifiers():獲取鼠標(biāo)的左鍵或右鍵。
(4) getClickCount():鼠標(biāo)被點(diǎn)擊的次數(shù)。
(5) getSource():獲取發(fā)生鼠標(biāo)的事件源。
(6) addMouseListener(監(jiān)視器):加放監(jiān)視器。
(7) removeMouseListener(監(jiān)視器):移去監(jiān)視器。
要實(shí)現(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è)置了一個(gè)文本區(qū),用于記錄一系列鼠標(biāo)事件。當(dāng)鼠標(biāo)進(jìn)入小應(yīng)用程序窗口時(shí),文本區(qū)顯示“鼠標(biāo)進(jìn)來(lái)”;當(dāng)鼠標(biāo)離開(kāi) 窗口時(shí),文本區(qū)顯示“鼠標(biāo)走開(kāi)”;當(dāng)鼠標(biāo)被按下時(shí),文本區(qū)顯示“鼠標(biāo)按下”,當(dāng)鼠標(biāo)被雙擊時(shí),文本區(qū)顯示“鼠標(biāo)雙擊”;并顯示鼠標(biāo)的坐標(biāo)。程序還顯示一個(gè)紅色的圓,當(dāng)點(diǎn)擊鼠標(biāo)時(shí),圓的半徑會(huì)不斷地變大。
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[]={"鼠標(biāo)鍵按下","鼠標(biāo)松開(kāi)","鼠標(biāo)進(jìn)來(lái)","鼠標(biāo)走開(kāi)","鼠標(biāo)雙擊"}; 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("鼠標(biāo)事件示意程序"); } }
任何組件上都可以發(fā)生鼠標(biāo)事件:鼠標(biāo)進(jìn)入、鼠標(biāo)退出、按下鼠標(biāo)等。例如,在上述程序中添加一個(gè)按鈕,并給按鈕對(duì)象添加鼠標(biāo)監(jiān)視器,將上述程序中的init()方法修改成如下形式,即能示意按鈕上的所有鼠標(biāo)事件。
JButton button; public void init(){ button = new JButton(“按鈕也能發(fā)生鼠標(biāo)事件”); r = 10; text = new JTextArea(15,20); add(button); add(text); button.addMouseListener(this); }
如果程序希望進(jìn)一步知道按下或點(diǎn)擊的是鼠標(biāo)左鍵或右鍵,鼠標(biāo)的左鍵或右鍵可用InputEvent類(lèi)中的常量BUTTON1_MASK和BUTTON3_MASK來(lái)判定。例如,以下表達(dá)式判斷是否按下或點(diǎn)擊了鼠標(biāo)右鍵:
e.getModifiers()==InputEvent. BUTTON3_MASK
MouseMotionListener接口
MouseMotionListener接口處理拖動(dòng)鼠標(biāo)和鼠標(biāo)移動(dòng)兩種事件。
注冊(cè)監(jiān)視器的方法是:
addMouseMotionListener(監(jiān)視器)
要實(shí)現(xiàn)的的接口方法有兩個(gè):
(1) mouseDragged(MouseEvent e)
(2) mouseMoved(MouseEvent e)
【例】一個(gè)滾動(dòng)條與顯示窗口同步變化的應(yīng)用程序。窗口有一個(gè)方塊,用鼠標(biāo)拖運(yùn)方塊,或用鼠標(biāo)點(diǎn)擊窗口,方塊改變顯示位置,相應(yīng)水平和垂直滾動(dòng)條的滑塊也會(huì)改變它們?cè)跐L動(dòng)條中的位置。反之,移動(dòng)滾動(dòng)條的滑塊,方塊在窗口中的顯示位置也會(huì)改變。
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("滾動(dòng)條示意程序"); } }
上述例子中,如果只要求通過(guò)滑動(dòng)滑塊,改變內(nèi)容的顯示位置,可以簡(jiǎn)單地使用滾動(dòng)面板JScrollPane。如果是這樣,關(guān)于滾動(dòng)條的創(chuàng)建和控制都可以免去,直接由JScrollPane內(nèi)部實(shí)現(xiàn)。參見(jiàn)以下修改后的MyWindow的定義:
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); } }
鼠標(biāo)指針形狀也能由程序控制 ,setCursor()方法能設(shè)置鼠標(biāo)指針形狀。例如,代碼setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。
相關(guān)文章
RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例
這篇文章主要為大家介紹了RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-08-08System.getProperty(“l(fā)ine.separator“)含義及意義詳解
這篇文章主要介紹了System.getProperty(“l(fā)ine.separator“)含義,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Druid之連接創(chuàng)建及銷(xiāo)毀示例詳解
這篇文章主要為大家介紹了Druid之連接創(chuàng)建及銷(xiāo)毀示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02【java 多線程】守護(hù)線程與非守護(hù)線程的詳解
這篇文章主要介紹了java守護(hù)線程與非守護(hù)線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04