一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解Java圖形化編程中的鼠標事件設(shè)計

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

2020-01-08 14:42goldensun JAVA教程

這篇文章主要介紹了Java圖形化編程中的鼠標事件設(shè)計,是Java的GUI開發(fā)中的基礎(chǔ)部分,需要的朋友可以參考下

鼠標事件的事件源往往與容器相關(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))。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 高中生放荡日记高h娜娜 | 日本高清在线观看天码888 | 四虎精品免费国产成人 | 国产麻豆剧果冻传媒观看免费视频 | 99ri国产在线观看 | 四虎精品成人免费视频 | x8x8国产在线观看2021 | 免费视频亚洲 | 韩国美女豪爽一级毛片 | 18性夜影院午夜寂寞影院免费 | 脱jk裙的美女露小内内无遮挡 | 精品视频在线免费看 | 小伙无套内射老女人 | 精品免费国产一区二区三区 | 国产免费成人在线视频 | 久久久精品3d动漫一区二区三区 | 久久天堂成人影院 | 国产日韩精品一区二区 | 亚洲精品国产国语 | 日本高清视频在线的 | 非洲黑女人性xxxx | 日韩一区二三区无 | poronovideos极度变态 | 国产精品国产色综合色 | 91精品国产高清久久久久久 | 91在线精品老司机免费播放 | 午夜伦伦电影理论片大片 | 99九九成人免费视频精品 | 亚洲国产午夜看片 | 欧美成人另类人妖 | 久久学生精品国产自在拍 | 亚洲精品国产一区二区第一页 | 国产成人精品高清不卡在线 | 爽爽窝窝午夜精品一区二区 | 极品 女神校花 露脸91 | 大乳孕妇一级毛片 | 精品国产乱码久久久人妻 | 午夜久久免影院欧洲 | 波多野结中文字幕在线69视频 | 免费一区 | 男人搡女人视频免费看 |