国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解Java圖形化編程中的鼠標事件設計

2019-11-26 14:56:28
字體:
來源:轉載
供稿:網友

鼠標事件的事件源往往與容器相關,當鼠標進入容器、離開容器,或者在容器中單擊鼠標、拖動鼠標時都會發生鼠標事件。java語言為處理鼠標事件提供兩個接口:MouseListener,MouseMotionListener接口。
MouseListener接口

MouseListener接口能處理5種鼠標事件:按下鼠標,釋放鼠標,點擊鼠標、鼠標進入、鼠標退出。相應的方法有:
(1) getX():鼠標的X坐標
(2) getY():鼠標的Y坐標
(3) getModifiers():獲取鼠標的左鍵或右鍵。
(4) getClickCount():鼠標被點擊的次數。
(5) getSource():獲取發生鼠標的事件源。
(6) addMouseListener(監視器):加放監視器。
(7) removeMouseListener(監視器):移去監視器。

要實現的MouseListener接口的方法有:
(1) mousePressed(MouseEvent e);
(2) mouseReleased(MouseEvent e);
(3) mouseEntered(MouseEvent e);
(4) mouseExited(MouseEvent e);
(5) mouseClicked(MouseEvent e);

【例】小應用程序設置了一個文本區,用于記錄一系列鼠標事件。當鼠標進入小應用程序窗口時,文本區顯示“鼠標進來”;當鼠標離開 窗口時,文本區顯示“鼠標走開”;當鼠標被按下時,文本區顯示“鼠標按下”,當鼠標被雙擊時,文本區顯示“鼠標雙擊”;并顯示鼠標的坐標。程序還顯示一個紅色的圓,當點擊鼠標時,圓的半徑會不斷地變大。

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("鼠標事件示意程序");  }}

任何組件上都可以發生鼠標事件:鼠標進入、鼠標退出、按下鼠標等。例如,在上述程序中添加一個按鈕,并給按鈕對象添加鼠標監視器,將上述程序中的init()方法修改成如下形式,即能示意按鈕上的所有鼠標事件。

JButton button;public void init(){  button = new JButton(“按鈕也能發生鼠標事件”);  r = 10;  text = new JTextArea(15,20);  add(button);  add(text);  button.addMouseListener(this);}

如果程序希望進一步知道按下或點擊的是鼠標左鍵或右鍵,鼠標的左鍵或右鍵可用InputEvent類中的常量BUTTON1_MASK和BUTTON3_MASK來判定。例如,以下表達式判斷是否按下或點擊了鼠標右鍵:

  e.getModifiers()==InputEvent. BUTTON3_MASK


MouseMotionListener接口

MouseMotionListener接口處理拖動鼠標和鼠標移動兩種事件。

注冊監視器的方法是:
    addMouseMotionListener(監視器)
要實現的的接口方法有兩個:
(1) mouseDragged(MouseEvent e)
(2) mouseMoved(MouseEvent e)

【例】一個滾動條與顯示窗口同步變化的應用程序。窗口有一個方塊,用鼠標拖運方塊,或用鼠標點擊窗口,方塊改變顯示位置,相應水平和垂直滾動條的滑塊也會改變它們在滾動條中的位置。反之,移動滾動條的滑塊,方塊在窗口中的顯示位置也會改變。

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("滾動條示意程序");  }}

上述例子中,如果只要求通過滑動滑塊,改變內容的顯示位置,可以簡單地使用滾動面板JScrollPane。如果是這樣,關于滾動條的創建和控制都可以免去,直接由JScrollPane內部實現。參見以下修改后的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);  }}

鼠標指針形狀也能由程序控制 ,setCursor()方法能設置鼠標指針形狀。例如,代碼setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禄丰县| 绥化市| 木兰县| 扎鲁特旗| 鹤岗市| 玛沁县| 阿坝| 章丘市| 新竹市| 赤水市| 墨玉县| 新乡县| 蓬安县| 玉树县| 兴仁县| 应用必备| 盐源县| 吉林省| 新巴尔虎右旗| 通州市| 康保县| 潮安县| 察隅县| 红桥区| 图木舒克市| 巨鹿县| 阳城县| 衡东县| 西宁市| 苍南县| 平塘县| 磴口县| 滨州市| 绿春县| 武定县| 焦作市| 聂拉木县| 常山县| 布拖县| 杭锦后旗| 肇源县|