Java-GUI編程之處理位圖
如果僅僅繪製一些簡單的幾何圖形,程序的圖形效果依然比較單調 。 AWT 也允許在組件上繪製位圖, Graphics 提供了 drawlmage() 方法用於繪製位圖,該方法需要一個Image參數一一代表位圖,通過該方法就可 以繪製出指定的位圖 。
位圖使用步驟:
1.創建Image的子類對象BufferedImage(int width,int height,int ImageType),創建時需要指定位圖的寬高及類型屬性;此時相當於在內存中生成了一張圖片;
2.調用BufferedImage對象的getGraphics()方法獲取畫筆,此時就可以往內存中的這張圖片上繪圖了,繪圖的方法和之前學習的一模一樣;
3.調用組件的drawImage()方法,一次性的內存中的圖片BufferedImage繪製到特定的組件上。
使用位圖繪製組件的好處:
使用位圖來繪製組件,相當於實現了圖的緩衝區,此時繪圖時沒有直接把圖形繪製到組件上,而是先繪製到內存中的BufferedImage上,等全部繪製完畢,再一次性的圖像顯示到組件上即可,這樣用戶的體驗會好一些。
案例:
通過BufferedImage實現一個簡單的手繪程序:通過鼠標可以在窗口中畫圖。
演示代碼:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class HandDraw {
//定義畫圖區的寬高
private final int AREA_WIDTH = 500;
private final int AREA_HEIGHT = 400;
//定義變量,保存上一次鼠標拖動時,鼠標的坐標
private int preX = -1;
private int preY = -1;
//定義一個右鍵菜單,用於設置畫筆的顏色
private PopupMenu colorMenu = new PopupMenu();
private MenuItem redItem = new MenuItem("紅色");
private MenuItem greenItem = new MenuItem("綠色");
private MenuItem blueItem = new MenuItem("藍色");
//定義一個BufferedImage對象
private BufferedImage image = new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_INT_RGB);
//獲取BufferedImage對象關聯的畫筆
private Graphics g = image.getGraphics();
//定義窗口對象
private Frame frame = new Frame("簡單手繪程序");
//定義畫布對象
private Canvas drawArea = new Canvas(){
public void paint(Graphics g) {
//把位圖image繪製到0,0坐標點
g.drawImage(image,0,0,null);
}
};
//定義一個Color對象,用來保存用戶設置的畫筆顏色,默認為黑色
private Color forceColor = Color.BLACK;
public void init(){
//定義顏色菜單項單擊監聽器
ActionListener menuListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
switch (command){
case "紅色":
forceColor=Color.RED;
break;
case "綠色":
forceColor = Color.GREEN;
break;
case "藍色":
forceColor = Color.BLUE;
break;
}
}
};
//為三個菜單項添加點擊事件
redItem.addActionListener(menuListener);
greenItem.addActionListener(menuListener);
blueItem.addActionListener(menuListener);
//把菜單項添加到右鍵菜單中
colorMenu.add(redItem);
colorMenu.add(greenItem);
colorMenu.add(blueItem);
//把右鍵菜單添加到繪圖區域drawArea
drawArea.add(colorMenu);
//將iamge圖片背景設置為白色
g.fillRect(0,0,AREA_WIDTH,AREA_HEIGHT);
//設置繪圖區域drawArea的大小
drawArea.setPreferredSize(new Dimension(AREA_WIDTH,AREA_HEIGHT));
//繪圖區域drawArea設置鼠標移動監聽器
drawArea.addMouseMotionListener(new MouseMotionAdapter() {
//用於繪製圖像
public void mouseDragged(MouseEvent e) {//按下鼠標鍵並拖動會觸發
//如果上次鼠標的坐標在繪圖區域,才開始繪圖
if (preX>0 && preY>0){
//設置當前選中的畫筆顏色
g.setColor(forceColor);
//繪製線條,需要有兩組坐標,一組是上一次鼠標拖動鼠標時的坐標,一組是現在鼠標的坐標
g.drawLine(preX,preY,e.getX(),e.getY());
}
//更新preX和preY
preX = e.getX();
preY = e.getY();
//重新繪製drawArea組件
drawArea.repaint();
}
});
drawArea.addMouseListener(new MouseAdapter() {
//用於彈出右鍵菜單
public void mouseReleased(MouseEvent e) {//鬆開鼠標鍵會觸發
boolean popupTrigger = e.isPopupTrigger();
if (popupTrigger){
//把colorMenu顯示到drawArea畫圖區域,並跟隨鼠標顯示
colorMenu.show(drawArea,e.getX(),e.getY());
}
//當鼠標鬆開時,把preX和preY重置為-1
preX = -1;
preY = -1;
}
});
//把drawArea添加到frame中
frame.add(drawArea);
//設置frame最佳大小並可見
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new HandDraw().init();
}
}
公眾號文章地址://mp.weixin.qq.com/s/TrbmvkBjNkurrAId7VMLnQ
個人博客://kohler19.gitee.io/
公眾號:愚生淺末