java畫圖之曲線拖動


目標:在窗體上按下鼠標按鍵、然后拖動鼠標,在按下和拖動之間繪制曲線
事件機制
事件源對象:窗體
事件監聽方法:addMouseListener(MouseListener l);addMouseMotionListener(MouseMotionListener l);
事件接口(事件處理類):MouseListener,MouseMotionListener

實現步驟:
1.定義DrawListener事件處理類,該類實現MouseListener和MouseMotionListener鼠標事件接口,實現接口中的抽象方法
2.實例化DrawListener事件處理類的對象,然后給事件源對象this窗體對象添加鼠標動作監聽方法和鼠標移動動作監聽方法。
3.在按下釋放的方法中獲取按下的坐標值,在拖動方法中獲取拖動的坐標值,根據按下和拖動的坐標值來繪制曲線

練習
1.實現曲線、刷子、橡皮、噴槍

實現的代碼如下:

/* 1.新建一個DrawListener事件處理類,該類實現MouseListener鼠標事件接口,實現接口中的抽象方法。
2.定義四個變量,在按下和釋放方法中獲取按下和釋放的坐標值。
3.定義Grpahics畫筆畫布類的對象,調用繪制圖形的方法來畫圖。
我們的組件是畫出來的,那么你要在哪一個組件上畫圖形,那你的畫筆畫布對象就從這個組件上獲取。
4.實例化DrawListener事件處理類的對象,對象名dl
5.給事件源窗體對象添加addMouseListener()鼠標監聽方法,指定事件處理類對象dl.
*/
package wenya63;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
* 定義一個畫圖界面類,該類繼承自JFrame窗體類
*/
public class drawFrame extends JFrame {
/**
* 程序入口主函數
*/
public static void main(String[] args) {
// 實例化窗體類的對象,調用初始化界面的方法
drawFrame df = new drawFrame();
df.initUI();
}
/**
* 自定義初始化界面的方法
*/
public void initUI() {
setTitle("圖畫");
setSize(600, 500);
setDefaultCloseOperation(3);
setLocationRelativeTo(null);
setLayout(new FlowLayout());
getContentPane().setBackground(Color.cyan);//改變背景顏色的命令   注意:是要改變背景色,g.setColor(Color.pink)設置的是按鈕框的顏色
JButton butLine = new JButton("曲線");
add(butLine);
butLine.setBackground(Color.ORANGE);
JButton butSharp = new JButton("刷子");
add(butSharp);
butSharp.setBackground(Color.ORANGE);
JButton butAngle = new JButton("橡皮");
add(butAngle);
butAngle.setBackground(Color.ORANGE);
JButton butHair = new JButton("噴槍");
add(butHair);
butHair.setBackground(Color.ORANGE);
setVisible(true);
//獲取窗體上畫筆畫布對象(注意:必須要在窗體可見之后才能獲取畫筆畫布對象,否則獲取的是null)
Graphics g = getGraphics();
//4.實例化DrawListener事件處理類的對象,對象名dl
drawListener dl = new drawListener();
//5.給事件源窗體對象添加addMouseListener()鼠標監聽方法,指定事件處理類對象dl.
addMouseListener(dl);
addMouseMotionListener(dl);
//調用畫圖Graphics
dl.setGraphics(g);
//按鈕的動作監聽,按鈕是事件源,也就是說只有當按下按鈕才會執行畫圖的動作,可以參考登錄界面的驗證登錄
butLine.addActionListener(dl);
butSharp.addActionListener(dl);
butAngle.addActionListener(dl);
butHair.addActionListener(dl);

}
}

 

 

package wenya63;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

/**
* 1.新建一個DrawListener和ActionListener事件處理類,
* 該類實現MouseListener鼠標事件接口,MouseMotionListener和ActionListener接口,實現接口中的抽象方法。
*/
public class drawListener implements MouseListener, MouseMotionListener,ActionListener {
private int x1, y1, x2, y2;// 聲明四個整數變量,用來記錄按下和釋放時的坐標值
private Graphics g;// 聲明一個畫筆畫布類的對象名
private String type;

// 向DrawFrame借畫筆畫布類的對象
public void setGraphics(Graphics gra) {
g = (Graphics2D) gra;//強制轉型

////設置畫筆抗鋸齒
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

}

/**
* 當在事件源上按下鼠標按鍵然后拖動鼠標時執行的方法。
*/

public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();

if (type.equals("曲線")) {
g.setColor(Color.green);
// 設置線條粗細
((Graphics2D) g).setStroke(new BasicStroke(5));
g.drawLine(x1, y1, x2, y2);// 如果寫成(x1,x2,y1,y2)就會使畫的曲線只能是固定方向的曲線
g.setColor(Color.BLACK);//恢復原來的顏色
}
x1 = x2;
y1 = y2;
if (type.equals("刷子")) {
g.setColor(Color.pink);
((Graphics2D) g).setStroke(new BasicStroke(10));
g.drawLine(x1, y1, x2, y2);
g.setColor(Color.BLACK);//恢復原來的顏色

}
if (type.equals("橡皮")) {
//注意要先設置顏色再畫
g.setColor(Color.white);
((Graphics2D) g).setStroke(new BasicStroke(30));
g.drawLine(x1, y1, x2, y2);
g.setColor(Color.BLACK);//恢復原來的顏色
}
if (type.equals("噴槍")) //難點
{
//設置線條粗細
((Graphics2D) g).setStroke(new BasicStroke(1));
Random rand = new Random();//實例化一個隨機數類的對象
int size = rand.nextInt(50);//隨機決定要畫的點數
for(int i=0;i<size;i++)
{
//在0-7之間可以取50次
int x = rand.nextInt(8);
int y = rand.nextInt(8);

g.drawLine(x1+x, y1+y, x1+x, y1+y);//不斷改變(x1,y1)的坐標值,實現在(x1,y1)的周圍畫點

}
}

}
/**
* Invoked when the mouse cursor has been moved onto a component but no
* buttons have been pushed.
*/
public void mouseMoved(MouseEvent e) {

}

/**
* 當你在事件源上發生鼠標點擊動作時執行的方法。(在同一個位置上按下並釋放才會執行點擊)
*/
public void mouseClicked(MouseEvent e) {

}

/**
* 當你在事件源上發生鼠標按下動作時執行的方法。
*/
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}

/**
* 當你在事件源上發生鼠標釋放動作時執行的方法。
*/
public void mouseReleased(MouseEvent e) {

}

/**
* 當你的鼠標進入到事件源是行時執行的方法。
*/
public void mouseEntered(MouseEvent e) {

}

/**
* 當你的鼠標離開到事件源是行時執行的方法。
*/
public void mouseExited(MouseEvent e) {
}

// 實現ActionListener的抽象方法
public void actionPerformed(ActionEvent e) {//Fn+F3得知ActionListener與MouseListener, MouseMotionListener不同的
type = e.getActionCommand();// ActionCommand獲取按鈕上的文字或者獲取事件源對象
}

}

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM