欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì)

 更新時(shí)間:2015年10月08日 17:32:44   投稿:goldensun  
這篇文章主要介紹了Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì),是Java的GUI開(kāi)發(fā)中的基礎(chǔ)部分,需要的朋友可以參考下

鼠標(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)示例

    這篇文章主要為大家介紹了RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-08-08
  • Java 詳解垃圾回收與對(duì)象生命周期

    Java 詳解垃圾回收與對(duì)象生命周期

    這篇文章主要介紹了Java 詳解垃圾回收與對(duì)象生命周期的相關(guān)資料,這里對(duì)堆內(nèi)存與棧內(nèi)存進(jìn)行詳解及JVM 的生命周期介紹,需要的朋友可以參考下
    2017-01-01
  • SpringBoot中的事務(wù)全方位詳解

    SpringBoot中的事務(wù)全方位詳解

    這篇文章主要介紹了SpringBoot中的事務(wù)全方位詳解,在Spring中,事務(wù)有兩種實(shí)現(xiàn)方式,分別是編程式事務(wù)管理和聲明式事務(wù)管理兩種方式,文中舉例詳細(xì)說(shuō)明了這兩種事務(wù),需要的朋友可以參考下
    2023-08-08
  • Java拆箱與裝箱實(shí)例詳解

    Java拆箱與裝箱實(shí)例詳解

    這篇文章主要介紹了Java拆箱與裝箱,結(jié)合實(shí)例形式詳細(xì)分析了Java拆箱與裝箱相關(guān)的數(shù)據(jù)類(lèi)型轉(zhuǎn)換操作技巧,需要的朋友可以參考下
    2019-11-11
  • 優(yōu)惠券優(yōu)惠的思路以及實(shí)踐

    優(yōu)惠券優(yōu)惠的思路以及實(shí)踐

    本文主要介紹了優(yōu)惠券優(yōu)惠的思路以及實(shí)踐。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • springboot中的dockerfile使用

    springboot中的dockerfile使用

    這篇文章主要介紹了springboot中的dockerfile使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • System.getProperty(“l(fā)ine.separator“)含義及意義詳解

    System.getProperty(“l(fā)ine.separator“)含義及意義詳解

    這篇文章主要介紹了System.getProperty(“l(fā)ine.separator“)含義,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Druid之連接創(chuàng)建及銷(xiāo)毀示例詳解

    Druid之連接創(chuàng)建及銷(xiāo)毀示例詳解

    這篇文章主要為大家介紹了Druid之連接創(chuàng)建及銷(xiāo)毀示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • spring設(shè)置攔截器代碼實(shí)例

    spring設(shè)置攔截器代碼實(shí)例

    這篇文章主要介紹了spring設(shè)置攔截器代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 【java 多線程】守護(hù)線程與非守護(hù)線程的詳解

    【java 多線程】守護(hù)線程與非守護(hù)線程的詳解

    這篇文章主要介紹了java守護(hù)線程與非守護(hù)線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論