畫圖工具-mini畫板

JFrame類

它是屏幕上window的對象,能夠最大化、最小化、關閉,解決將Swing三大基本構造塊

(按鈕、標籤、文本字段)組織起來,並把它們呈現給用戶——(容器)

JPanel類

是java圖形用戶界面(GUI)工具包swing中的面板容器類,是一種輕量級容器,可以加入到Fram窗體中,其自身可以嵌套組合,在不同子容器中包含其他組件(Button,TextArea等)功能是對窗體上的這些控制進進行組合。

以下是部分代碼實現:

package mini.draw.Pad;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

/**
 * 畫圖工具類
 * 1.創建一個窗體
 * 2.創建面圖花板
 * 3.實現隨筆畫功能
 * 4.擴充菜單欄
 * 5.擴充性狀態欄(按鈕)
 */
public class MiniDrawPad {

    private JFrame jFrame = new JFrame("迷你畫圖板");//帶有標題和邊框的頂層窗口

    //定義畫圖區域的高度和寬度
    private final int WIDTH = 1000;
    private final int HEIGHT = 700;

    private MyPanel mp = new MyPanel();
    //定義一個BufferedImage對象,並獲取image對象的Graphics-畫筆
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    //指定一個寬和高,創建一個不帶透明色的對象


    Graphics2D g = (Graphics2D) image.getGraphics(); //獲得在圖像上畫圖的工具-畫筆
    //設置畫筆的顏色
    private Color color = Color.black; //當前默認顏色黑色
    //畫筆的粗細
    private float stroke = 1.0f;

    //上一次鼠標拖動事件的鼠標座標
    private int prex = -1;
    private int prey = -1;

    int R, G, B; //用來存放當前的色彩值

    String style1; //用來存放當前字體
    JLabel statusBar;//當前鼠標狀態

    //創建畫板類
    public class MyPanel extends JPanel {
        //設置畫板
        public MyPanel() {

            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
            setBounds(0, 0, WIDTH, HEIGHT);
            setBackground(Color.WHITE);


        }

        public void paint(Graphics g) {
            g.drawImage(image, 0, 0, null);
            //img-要繪製的指定圖像,如果爲null,該方法不執行任何操作
        }
    }


    //選擇顏色
    public void chooseColor() {
        color = JColorChooser.showDialog(jFrame, "選擇顏色", color);
        R = color.getRed();
        G = color.getGreen();
        B = color.getBlue();

        color = new Color(R, G, B);

    }


    //獲取畫筆

    //創建菜單條
    public void createBar() {
        JMenuBar bar = new JMenuBar();//定義菜單條

        JMenu fileMenu = new JMenu("file");//
        fileMenu.setMnemonic('F');//表示助記符的鍵代碼
        JMenuItem newItem = new JMenuItem("New");//菜單項
        newItem.setMnemonic('N');
        JMenuItem saveItem = new JMenuItem("Save");//菜單項
        saveItem.setMnemonic('S');
        JMenuItem openItem = new JMenuItem("Open");//菜單項
        openItem.setMnemonic('O');

        //退出菜單項
        JMenuItem exitItem = new JMenuItem("Exit");//菜單項
        exitItem.setMnemonic('E');
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });


        fileMenu.add(newItem);
        fileMenu.add(saveItem);
        fileMenu.add(openItem);
        fileMenu.addSeparator();
        fileMenu.add(exitItem);

        //顏色菜單
        JMenu colorMenu = new JMenu("Color");
        JMenuItem colorItem = new JMenuItem("Choose Color");
        colorItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //如果被觸發,則調用選擇顏色函數段
                chooseColor();
            }
        });
        colorMenu.add(colorItem);


        //設置線條粗細菜單
        JMenu strokeMenu = new JMenu("Stroke");
        JMenuItem strokeItem = new JMenuItem("Set Stroke");
        strokeItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //如果被觸發,則調用設置線條粗細的函數段
                setStroke();
            }
        });
        strokeMenu.add(strokeItem);

        //設置提示菜單
        JMenu helpMenu = new JMenu("Help");
        JMenuItem aboutItem = new JMenuItem("About this Draw pad!");
        aboutItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "this is a mini draw pad Copy(c)2020",
                        "畫圖板程序說明", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        helpMenu.add(aboutItem);


        bar.add(fileMenu);
        bar.add(colorMenu);
        bar.add(strokeMenu);
        bar.add(helpMenu);
        jFrame.setJMenuBar(bar);

    }


    //設置線條粗細
    public void setStroke() {
        String input = JOptionPane.showInputDialog("請輸入一個float數值( >0 )");
        stroke = Float.parseFloat(input);
    }


    //創建按鈕


    public void createButton() {
        JToolBar buttonPanel = new JToolBar(JToolBar.HORIZONTAL);
        String[] buttonNames = {"隨筆", "直線", "空心圓", "空心矩形", "橡皮擦", "文字按鈕"};
        for (int i = 0; i < buttonNames.length; i++) {
            JButton button = new JButton(buttonNames[i]);
            buttonPanel.add(button);
        }

        //設置字體風格的選擇

        String[] styleNames = {"宋體", "隸書", "楷體", "仿宋", "華文行楷", "方正舒體", "仿宋_GB2312", "Serif"};
        JComboBox styles = new JComboBox<>(styleNames);
        styles.setMaximumRowCount(6);  //設置JComboBox顯示的最大行數
        styles.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                style1 = styleNames[styles.getSelectedIndex()];
            }
        });
        styles.setMinimumSize(new Dimension(50, 20));
        styles.setMaximumSize(new Dimension(120, 20));
        JCheckBox bold = new JCheckBox("BOLD"); //複選框
        JCheckBox italic = new JCheckBox("ITALIC"); //


        buttonPanel.add(bold);
        buttonPanel.add(italic);
        buttonPanel.add(styles);

        statusBar = new JLabel("當前的鼠標狀態");
        statusBar.setText("welcome minidraw pad!!!");
        Container c = jFrame.getContentPane();//初始化一個容器
        c.add(buttonPanel, BorderLayout.NORTH);
        c.add(statusBar, BorderLayout.SOUTH);
    }

    public void init() {
        /**
         對於鼠標的移動和拖放,用鼠標運動監聽器MouseMotionListener
         */
        mp.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (prex > 0 && prey > 0) {
                    g.setColor(color);
                    g.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
                    g.drawLine(prex, prey, e.getX(), e.getY());
                    //x1,x2是確定直線的起始點,分別是橫縱座標,同理x2,y2確定直線的終點
                }
                prex = e.getX();
                prey = e.getY();
                statusBar.setText("Mouse Press @[" + e.getX() + "," + e.getY() + "]");
                mp.repaint(); //重繪mp對象

            }
        });


        jFrame.setBounds(0, 0, WIDTH, HEIGHT);
        jFrame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);

            }
        });
        g.fillRect(0, 0, WIDTH, HEIGHT);
        jFrame.add(mp);
        createBar();
        createButton();
        jFrame.setVisible(true);

    }


    public static void main(String[] args) {
        MiniDrawPad miniDrawPad = new MiniDrawPad();
        miniDrawPad.init();
    }

}

 由於時間關係,沒能做完,只是半成。。。 以後有時間再繼續完成把。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章