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/
公眾號:愚生淺末