Java编写的画图板-类似window的画图,窗体程序 直接运行

开发环境

开发语言为Java,开发环境Eclipse或者IDEA都可以。数据库采用:MySQL。运行主程序,或者执行打开JAR文件即可以运行本程序。

系统框架

利用JDK自带的SWING框架开发,不需要安装第三方JAR包。无数据库,纯窗体模式,直接运行Main文件即可以

主要功能

本次分享的为Java编写的画图板,功能类似window自带的画板,主要的功能有以下一些

1 画笔功能:画直线、画曲线

2橡皮擦功能:类似window的橡皮擦,擦擦指定的区域

3 画矩形:拖动画一个矩形

4 画椭圆:拖动画一个椭圆

5 文字:在指定的区域编写文字,包括文字

6 设置:设置字体类型,字体大小、字体颜色,

7 打开图片,修改图片,保存图片

8 撤销和重做功能。可以对指定的操作重做,也可以指定的操作进行撤销

9 设置画图板的前景颜色和背景颜色

这个项目涵盖了java 窗体编程的各种知识,包括UI界面设计、时间处理、文件、事件处理操作等。通过这个项目能快速提升java 窗体编程,是非常好的一个项目。代码可以直接运行,没有任何bug。有详细的操作手册。

实现效果

主要代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.font.*;

public class Painter extends JFrame implements ActionListener {
    private    Container c = getContentPane();
    private    String menuBar[]={"文件(F)","编辑(E)","视图(V)","说明(H)"};
    private    String menuItem[][]={
        {"新建(N)|78","打开(O)|79","保存(S)|83","另存为(A)","退出(X)|88"},
        {"撤消(U)|90","重复(R)|89","剪切(T)|87","复制(C)|68","粘贴(P)|85"},
        {"工具箱(T)|84","色块(C)|76","状态栏(S)","属性栏(M)"},
        {"关于画板(A)"}
    };
    private    JMenuItem jMenuItem[][]=new JMenuItem[4][5];
    private    JMenu jMenu[];
    private    JCheckBoxMenuItem jCheckBoxMenuItem[] = new JCheckBoxMenuItem[4];
    private    String ButtonName[]={"直线","矩开","椭圆","圆角矩形","贝氏曲线","扇型","多边形","铅笔","橡皮擦","文字","选取"};
    private JToggleButton jToggleButton[];
    private ButtonGroup buttonGroup;
    private    JPanel jPanel[]=new JPanel[5];//1绘图区,2工具箱,3色块,4属性栏
    private    JLabel jLabel[]=new JLabel[1];//状态列
    private    String toolname[]= 
{"img/tool1.gif","img/tool2.gif","img/tool3.gif","img/tool4.gif","img/tool5.gif","img/tool8.gif","img/tool9.gif","img/tool7.gif","img/tool6.gif","img/tool10.gif","img/tool11.gif"};
    private    Icon tool[]=new ImageIcon[11];
    private    int i,j,show_x,show_y,drawMethod=7,draw_panel_width=700,draw_panel_height=500;
    private Paint color_border,color_inside;
    private SetPanel setPanel;
    private DrawPanel drawPanel;
    private UnderDrawPanel underDrawPanel;
    private ColorPanel colorPanel;
    private Stroke stroke;
    private Shape shape;
    private String isFilled;
    
    
    public Painter(){
        //设定JMenuBar,并产生MenuItem、并设置快捷键
        JMenuBar bar = new JMenuBar();
        jMenu=new JMenu[menuBar.length];
        for(i=0;i<menuBar.length;i++){
            jMenu[i] = new JMenu(menuBar[i]);
            jMenu[i].setMnemonic(menuBar[i].split("\\(")[1].charAt(0));
            bar.add(jMenu[i]);
        }
        
        for(i=0;i<menuItem.length;i++){
            for(j=0;j<menuItem[i].length;j++){
                if(i==0 && j==4 || i==1 && j==2) jMenu[i].addSeparator();
                if(i!=2){
                    jMenuItem[i][j] = new JMenuItem(menuItem[i][j].split("\\|")[0]);
                    if(menuItem[i][j].split("\\|").length!=1)
                        jMenuItem[i][j].setAccelerator(KeyStroke.getKeyStroke(Integer.parseInt(menuItem[i][j].split("\\|")[1]),  
ActionEvent.CTRL_MASK) );
                    jMenuItem[i][j].addActionListener(this);
                    jMenuItem[i][j].setMnemonic(menuItem[i][j].split("\\(")[1].charAt(0));

                    jMenu[i].add(jMenuItem[i][j]);
                }
                else{
                    jCheckBoxMenuItem[j] = new JCheckBoxMenuItem(menuItem[i][j].split("\\|")[0]);
                    if(menuItem[i][j].split("\\|").length!=1)
                        jCheckBoxMenuItem[j].setAccelerator(KeyStroke.getKeyStroke(Integer.parseInt(menuItem[i][j].split("\\|")[1]),  
ActionEvent.CTRL_MASK) );
                    jCheckBoxMenuItem[j].addActionListener(this);
                    jCheckBoxMenuItem[j].setMnemonic(menuItem[i][j].split("\\(")[1].charAt(0));
                    jCheckBoxMenuItem[j].setSelected( true );
                    jMenu[i].add(jCheckBoxMenuItem[j]);
                }
            }
        }
        this.setJMenuBar( bar );
        c.setLayout( new BorderLayout() );
        for(i=0;i<5;i++)
            jPanel[i]=new JPanel();
            
        jLabel[0]=new JLabel(" 状态列");
        
        buttonGroup = new ButtonGroup();
        JToolBar jToolBar=new JToolBar("工具箱",JToolBar.VERTICAL);
        jToggleButton=new JToggleButton[ButtonName.length];
        for(i=0;i<ButtonName.length;i++){
            tool[i] = new ImageIcon(toolname[i]);
            jToggleButton[i] = new JToggleButton(tool[i]);
            jToggleButton[i].addActionListener( this );
            jToggleButton[i].setFocusable( false );
            buttonGroup.add(jToggleButton[i]);
        }
        jToolBar.add(jToggleButton[7]);
        jToolBar.add(jToggleButton[8]);
        jToolBar.add(jToggleButton[0]);
        jToolBar.add(jToggleButton[4]);
        jToolBar.add(jToggleButton[1]);
        jToolBar.add(jToggleButton[3]);
        jToolBar.add(jToggleButton[2]);
        jToolBar.add(jToggleButton[5]);
        jToolBar.add(jToggleButton[6]);
        jToolBar.add(jToggleButton[9]);
        jToolBar.add(jToggleButton[10]);
        jToggleButton[7].setSelected(true);
        jToolBar.setLayout( new GridLayout( 6, 2, 2, 2 ) );
        jPanel[2].add(jToolBar);
        
        jToolBar.setFloatable(false);//无法移动
        
        colorPanel=new ColorPanel();
        jPanel[3].setLayout(new FlowLayout(FlowLayout.LEFT));
        jPanel[3].add(colorPanel);
        
        drawPanel=new DrawPanel();
        underDrawPanel=new UnderDrawPanel();
        underDrawPanel.setLayout(null);
        underDrawPanel.add(drawPanel);
        drawPanel.setBounds(new Rectangle(2, 2, draw_panel_width, draw_panel_height));
        
        setPanel=new SetPanel();
        jPanel[4].add(setPanel);
        
        jPanel[0].setLayout( new BorderLayout() );
        jPanel[0].add(underDrawPanel,BorderLayout.CENTER);
        jPanel[0].add(jPanel[2],BorderLayout.WEST);
        jPanel[0].add(jPanel[3],BorderLayout.SOUTH);
        jPanel[0].add(jPanel[4],BorderLayout.EAST);
        
        jLabel[0].setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        underDrawPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        underDrawPanel.setBackground(new Color(128,128,128));
        jPanel[3].setBorder(BorderFactory.createMatteBorder(1,0,0,0,new Color(172,168,153)));
        
        c.add(jPanel[0],BorderLayout.CENTER);
        c.add(jLabel[0],BorderLayout.SOUTH);
        
        setSize(draw_panel_width,draw_panel_height);
        setTitle("七喜猫猫画板");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        show();
    }




    @SuppressWarnings("deprecation")
    public void save(){
        FileDialog fileDialog = new FileDialog( new Frame() , "请指定一个文件名", FileDialog.SAVE );
        fileDialog.show();
        if(fileDialog.getFile()==null) return;
        drawPanel.filename = fileDialog.getDirectory()+fileDialog.getFile();
    }
    
    @SuppressWarnings("deprecation")
    public void actionPerformed( ActionEvent e ){
        for(i=0;i<ButtonName.length;i++){
            if(e.getSource()==jToggleButton[i]){
                drawMethod=i;
                if(drawMethod==5)
                    setPanel.pie_add_ctrl();
                else
                    setPanel.pie_remove_ctrl();
                if(drawMethod==7 || drawMethod==8)
                    setPanel.pencil_add_ctrl();
                else
                    setPanel.pencil_remove_ctrl();
                drawPanel.clear();
                drawPanel.repaint();
                   jMenuItem[1][2].setEnabled(false);
                   jMenuItem[1][3].setEnabled(false);
            }
        }
        
        if(e.getSource()==jMenuItem[1][0]){
            drawPanel.undo();
        }
        else if(e.getSource()==jMenuItem[1][1]){
            drawPanel.redo();
        }
        else if(e.getSource()==jMenuItem[1][2]){
            drawPanel.cut();
        }
        else if(e.getSource()==jMenuItem[1][3]){
            drawPanel.copy();
        }
        else if(e.getSource()==jMenuItem[1][4]){
            drawPanel.paste();
        }
        else if(e.getSource()==jMenuItem[0][0]){//开新文档
            underDrawPanel.remove(drawPanel);
            drawPanel=null;
            drawPanel=new DrawPanel();
            underDrawPanel.add(drawPanel);
            drawPanel.setBounds(new Rectangle(2, 2, draw_panel_width, draw_panel_height));
            underDrawPanel.ctrl_area.setLocation(draw_panel_width+3,draw_panel_height+3);
            underDrawPanel.ctrl_area2.setLocation(draw_panel_width+3,draw_panel_height/2+3);
            underDrawPanel.ctrl_area3.setLocation(draw_panel_width/2+3,draw_panel_height+3);
            repaint();
        }
        else if(e.getSource()==jMenuItem[0][1]){//开启旧文档
            FileDialog fileDialog = new FileDialog( new Frame() , "选择一个文档", FileDialog.LOAD );
            fileDialog.show();
            if(fileDialog.getFile()==null) return;
            
            underDrawPanel.removeAll();
            drawPanel=null;
            drawPanel=new DrawPanel();
            underDrawPanel.add(drawPanel);
            drawPanel.setBounds(new Rectangle(2, 2, draw_panel_width, draw_panel_height));
            
            drawPanel.openfile(fileDialog.getDirectory()+fileDialog.getFile());
        }
        else if(e.getSource()==jMenuItem[0][2]){//存储档案
            if(drawPanel.filename==null){
                save();
            }
            else{
                try{
                    int dotpos = drawPanel.filename.lastIndexOf('.');
                    ImageIO.write(drawPanel.bufImg, drawPanel.filename.substring(dotpos + 1), new File(drawPanel.filename));
                }
                catch(IOException even) {
                    JOptionPane.showMessageDialog(null, even.toString(),"无法存储文档", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        else if(e.getSource()==jMenuItem[0][3]){//另存新档
            save();
            try{
                int dotpos = drawPanel.filename.lastIndexOf('.');
                ImageIO.write(drawPanel.bufImg, drawPanel.filename.substring(dotpos + 1), new File(drawPanel.filename));
            }
            catch(IOException even) {
                JOptionPane.showMessageDialog(null, even.toString(),"无法保存", JOptionPane.ERROR_MESSAGE);
            }
        }
        else if(e.getSource()==jMenuItem[0][4]){//离开
            System.exit(0);
        }
        else if(e.getSource()==jMenuItem[3][0]){//关于
            JOptionPane.showMessageDialog(null, "七喜猫猫稳定版 ", "七喜笨猫", 1, new ImageIcon("img/paint.gif"));
        }
        for(i=0;i<2;i++){
            if(jCheckBoxMenuItem[i].isSelected())
                jPanel[i+2].setVisible( true );
               else
                   jPanel[i+2].setVisible( false );
           }
           if(jCheckBoxMenuItem[3].isSelected()){
               setPanel.setVisible( true );
               jPanel[4].setVisible( true );
           }
           else{
               setPanel.setVisible( false );
               jPanel[4].setVisible( false );
           }
        if(jCheckBoxMenuItem[2].isSelected())
            jLabel[0].setVisible( true );
           else
               jLabel[0].setVisible( false );
    }
    
        public void actionPerformed( ActionEvent e ){
            jDialog.dispose();
        }
        public void itemStateChanged( ItemEvent e ){
            if ( e.getSource() == bold )
                if ( e.getStateChange() == ItemEvent.SELECTED )
                    valBold = Font.BOLD;
                else
                    valBold = Font.PLAIN;
            if ( e.getSource() == italic )
                if ( e.getStateChange() == ItemEvent.SELECTED )
                    valItalic = Font.ITALIC;
                else
                    valItalic = Font.PLAIN;
        }
        
        public Dimension getPreferredSize(){
            return new Dimension( draw_panel_width, draw_panel_height );
        }
        
        public void openfile(String filename){//开启旧档
            Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
            ImageIcon icon = new ImageIcon(filename);
            g2d_bufImg.drawImage(icon.getImage(),0,0,this);
            
            count++;
            bufImg_data[count] = new BufferedImage(draw_panel_width, draw_panel_height, BufferedImage.TYPE_3BYTE_BGR);
            Graphics2D g2d_bufImg_data = (Graphics2D) bufImg_data[count].getGraphics();
            g2d_bufImg_data.drawImage(bufImg,0,0,this);
            
            repaint();
        }
        
        public void undo(){//复原
               count--;
            
               draw_panel_width=bufImg_data[count].getWidth();
               draw_panel_height=bufImg_data[count].getHeight();
               drawPanel.setSize(draw_panel_width,draw_panel_height);

            bufImg = new BufferedImage(draw_panel_width, draw_panel_height,BufferedImage.TYPE_3BYTE_BGR);
            jlbImg = new JLabel(new ImageIcon(bufImg));//在JLabel上放置bufImg,用来绘图
            this.removeAll();
            this.add(jlbImg);
            jlbImg.setBounds(new Rectangle(0, 0, draw_panel_width, draw_panel_height));
            
            Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
            g2d_bufImg.setPaint(Color.white);
            g2d_bufImg.fill(new Rectangle2D.Double(0,0,draw_panel_width,draw_panel_height));
            g2d_bufImg.drawImage(bufImg_data[count],0,0,this);

            underDrawPanel.ctrl_area.setLocation(draw_panel_width+3,draw_panel_height+3);
            underDrawPanel.ctrl_area2.setLocation(draw_panel_width+3,draw_panel_height/2+3);
            underDrawPanel.ctrl_area3.setLocation(draw_panel_width/2+3,draw_panel_height+3);
            
            underDrawPanel.x=draw_panel_width;
            underDrawPanel.y=draw_panel_height;
            
               if(count<=0)
                   jMenuItem[1][0].setEnabled(false);
            jMenuItem[1][1].setEnabled(true);
            cut=3;
               repaint();
           }

        public void redo(){//重做
            count++;
            
               draw_panel_width=bufImg_data[count].getWidth();
               draw_panel_height=bufImg_data[count].getHeight();
               drawPanel.setSize(draw_panel_width,draw_panel_height);

            bufImg = new BufferedImage(draw_panel_width, draw_panel_height,BufferedImage.TYPE_3BYTE_BGR);
            jlbImg = new JLabel(new ImageIcon(bufImg));//在JLabel上放置bufImg,用来绘图
            this.removeAll();
            this.add(jlbImg);
            jlbImg.setBounds(new Rectangle(0, 0, draw_panel_width, draw_panel_height));
            
            Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
            g2d_bufImg.setPaint(Color.white);
            g2d_bufImg.fill(new Rectangle2D.Double(0,0,draw_panel_width,draw_panel_height));
            g2d_bufImg.drawImage(bufImg_data[count],0,0,this);

            underDrawPanel.ctrl_area.setLocation(draw_panel_width+3,draw_panel_height+3);
            underDrawPanel.ctrl_area2.setLocation(draw_panel_width+3,draw_panel_height/2+3);
            underDrawPanel.ctrl_area3.setLocation(draw_panel_width/2+3,draw_panel_height+3);
            
            underDrawPanel.x=draw_panel_width;
            underDrawPanel.y=draw_panel_height;
            
            if(redo_lim<count)
                jMenuItem[1][1].setEnabled(false);
            jMenuItem[1][0].setEnabled(true);
            cut=3;
               repaint();
           }
        
        public void cut(){
            bufImg_cut = new BufferedImage((int)rectangle2D_select.getWidth(), (int)rectangle2D_select.getHeight(),  
BufferedImage.TYPE_3BYTE_BGR);
            BufferedImage copy = bufImg.getSubimage((int)rectangle2D_select.getX(),(int)rectangle2D_select.getY(),(int) 
rectangle2D_select.getWidth(),(int)rectangle2D_select.getHeight());
            Graphics2D g2d_bufImg_cut = (Graphics2D) bufImg_cut.createGraphics();
            g2d_bufImg_cut.drawImage(copy,0,0,this);
            
            Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
            g2d_bufImg.setPaint(Color.WHITE);
            g2d_bufImg.fill(new Rectangle2D.Double((int)rectangle2D_select.getX(),(int)rectangle2D_select.getY(),(int) 
rectangle2D_select.getWidth(),(int)rectangle2D_select.getHeight()));
            
            redo_lim=count++;
            jMenuItem[1][1].setEnabled(false);
            
               //新增一张BufferedImage型态至bufImg_data[count],并将bufImg绘制至bufImg_data[count]//
               bufImg_data[count] = new BufferedImage(draw_panel_width, draw_panel_height, BufferedImage.TYPE_3BYTE_BGR);
               Graphics2D g2d_bufImg_data = (Graphics2D) bufImg_data[count].getGraphics();
               g2d_bufImg_data.drawImage(bufImg,0,0,this);

            //判断坐标为新起点//
            press=0;
            
            //让复原MenuItem可以点选//
               if(count>0)
                   jMenuItem[1][0].setEnabled(true);
               jMenuItem[1][2].setEnabled(false);
               jMenuItem[1][3].setEnabled(false);
            jMenuItem[1][4].setEnabled(true);
            cut=3;
            repaint();
        }
        public void copy(){
            bufImg_cut = new BufferedImage((int)rectangle2D_select.getWidth(), (int)rectangle2D_select.getHeight(),  
BufferedImage.TYPE_3BYTE_BGR);
            BufferedImage copy = bufImg.getSubimage((int)rectangle2D_select.getX(),(int)rectangle2D_select.getY(),(int) 
rectangle2D_select.getWidth(),(int)rectangle2D_select.getHeight());
            Graphics2D g2d_bufImg_cut = (Graphics2D) bufImg_cut.createGraphics();
            g2d_bufImg_cut.drawImage(copy,0,0,this);
            jMenuItem[1][4].setEnabled(true);
            cut=1;
            repaint();
        }
        public void paste(){
            cut=2;
            repaint();
        }
        public void mousePressed(MouseEvent e) {
            x1=e.getX();
            y1=e.getY();
            if(first==0){
                polygon = new Polygon();
                polygon.addPoint(x1, y1);
                first=1;
            }
            //判断坐标为新起点//
            press=1;
            chk=0;
            if(cut!=2) cut=0;
        }

        public void mouseReleased(MouseEvent e) {
            x2=e.getX();
            y2=e.getY();
            
            if(step_chk==0)//控制贝氏曲线用
                step=1;
            else if(step_chk==1)
                step=2;
            
            if(step_chk_arc==0)//控制扇型用
                chk=step_arc=1;
            else if(step_chk_arc==1)
                chk=step_arc=2;
            
            if(drawMethod==6 && click!=1){
                polygon.addPoint(x2, y2);
                repaint();
            }
            if(drawMethod==10){
                if(cut!=2) cut=1;
                select_x=(int)rectangle2D_select.getX();
                select_y=(int)rectangle2D_select.getY();
                select_w=(int)rectangle2D_select.getWidth();
                select_h=(int)rectangle2D_select.getHeight();
                jMenuItem[1][2].setEnabled(true);
                jMenuItem[1][3].setEnabled(true);
            }

            if((step_chk==2 && step==2) || (step_chk_arc==2 && step_arc==2) || drawMethod==0 || drawMethod==1 || drawMethod==2 || drawMethod==3 ||  
drawMethod==7 || drawMethod==8 || drawMethod==9 || cut==2){//当不是画贝氏曲线或是已经完成贝氏曲线时画
                toDraw();
            }
        }
        public void clear(){
            cut=select_x=select_y=select_w=select_h=step_chk_arc=step_arc=first=step_chk=step=0;
            x1=x2=y1=y2=-1;
        }
        
        public void toDraw(){
            if(x1<0 || y1<0) return;//防止误按
            chk=3;
            draw(x1,y1,x2,y2);
            
            //画出图形至bufImg//
            Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
            if(cut!=2){
                if(color_inside!=null && drawMethod!=8){
                    g2d_bufImg.setPaint(color_inside);
                    g2d_bufImg.fill(shape);
                }
                if(color_border!=null && drawMethod!=8){
                    g2d_bufImg.setPaint(color_border);
                    g2d_bufImg.setStroke(stroke);
                    g2d_bufImg.draw(shape);
                }
            }
            else{
                   g2d_bufImg.drawImage(bufImg_cut,x2,y2,this);
            }
            repaint();
            clear();
            //记录可重做最大次数,并让重做不可按//
            redo_lim=count++;
            jMenuItem[1][1].setEnabled(false);
            
               //新增一张BufferedImage型态至bufImg_data[count],并将bufImg绘制至bufImg_data[count]//
               bufImg_data[count] = new BufferedImage(draw_panel_width, draw_panel_height, BufferedImage.TYPE_3BYTE_BGR);
               Graphics2D g2d_bufImg_data = (Graphics2D) bufImg_data[count].getGraphics();
               g2d_bufImg_data.drawImage(bufImg,0,0,this);
               
            //判断坐标为新起点//
            press=0;
            
            //让复原MenuItem可以点选//
               if(count>0)
                   jMenuItem[1][0].setEnabled(true);
        }
        
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
        public void mouseClicked(MouseEvent e){
            if(click==1){//连点两下时
                toDraw();
            }
            click=1;
        }
        
        public void mouseDragged(MouseEvent e){
            x2=e.getX();
            y2=e.getY();
            if(drawMethod==7 || drawMethod==8){
                draw(x1,y1,x2,y2);
                x1=e.getX();
                y1=e.getY();
            }
            if(drawMethod!=9)
                repaint();
        }

        public void mouseMoved(MouseEvent e) {
            show_x=x2=e.getX();
            show_y=y2=e.getY();
            
            jLabel[0].setText(show_x+","+show_y);
            click=0;
            if(drawMethod==7 || drawMethod==8 || cut==2)
                repaint();
        }
        
        public void draw(int input_x1,int input_y1,int input_x2,int input_y2){
            if(drawMethod==0){//直线时,让shape为Line2D
                shape=line2D;
                line2D.setLine(input_x1,input_y1,input_x2,input_y2);
            }
            else if(drawMethod==1){//矩型时,让shape为Rectangle2D
                shape=rectangle2D;
                rectangle2D.setRect(Math.min(input_x1,input_x2),Math.min(input_y1,input_y2),Math.abs(input_x1-input_x2),Math.abs(input_y1- 
input_y2));
            }
            else if(drawMethod==2){//椭圆时
                shape=ellipse2D;
                ellipse2D.setFrame(Math.min(input_x1,input_x2),Math.min(input_y1,input_y2),Math.abs(input_x1-input_x2),Math.abs(input_y1- 
input_y2));
            }
            else if(drawMethod==3){//圆角矩型
                shape=roundRectangle2D;
                roundRectangle2D.setRoundRect(Math.min(input_x1,input_x2),Math.min(input_y1,input_y2),Math.abs(input_x1-input_x2),Math.abs 
(input_y1-input_y2),10.0f,10.0f);
            }
            else if(drawMethod==4){//贝氏曲线
                shape=cubicCurve2D;
                if(step==0){
                    cubicCurve2D.setCurve(input_x1,input_y1,input_x1,input_y1,input_x2,input_y2,input_x2,input_y2);
                    temp_x1=input_x1;
                    temp_y1=input_y1;
                    temp_x2=input_x2;
                    temp_y2=input_y2;
                    step_chk=0;
                }
                else if(step==1){
                    cubicCurve2D.setCurve(temp_x1,temp_y1,input_x2,input_y2,input_x2,input_y2,temp_x2,temp_y2);
                    temp_x3=input_x2;
                    temp_y3=input_y2;
                    step_chk=1;
                }
                else if(step==2){
                    cubicCurve2D.setCurve(temp_x1,temp_y1,temp_x3,temp_y3,input_x2,input_y2,temp_x2,temp_y2);
                    step_chk=2;
                }
            }
            else if(drawMethod==5){//扇型,chk用来防止意外的repaint//
                if(step_arc==0 || chk==1){//步骤控制
                    shape=ellipse2D;
                    ellipse2D.setFrame(Math.min(input_x1,input_x2),Math.min(input_y1,input_y2),Math.abs(input_x1-input_x2),Math.abs 
(input_y1-input_y2));
                    temp_x1=input_x1;
                    temp_y1=input_y1;
                    temp_x2=input_x2;
                    temp_y2=input_y2;
                    step_chk_arc=0;
                }
                else if(step_arc==1 || chk==2){//步骤控制
                    shape=arc2D;

                    center_point_x = Math.min(temp_x1,temp_x2)+Math.abs(temp_x1-temp_x2)/2;
                    center_point_y = Math.min(temp_y1,temp_y2)+Math.abs(temp_y1-temp_y2)/2;
                    
                    double a = Math.pow(Math.pow(input_x2-center_point_x,2)+Math.pow(input_y2-center_point_y,2),0.5);
                    double b = input_x2-center_point_x;
                    if(input_y2>center_point_y)
                        start=360+Math.acos(b/a)/Math.PI*-180;
                    else
                        start=Math.acos(b/a)/Math.PI*180;
                    
                    arc2D.setArc(Math.min(temp_x1,temp_x2),Math.min(temp_y1,temp_y2),Math.abs(temp_x1-temp_x2),Math.abs(temp_y1- 
temp_y2),start,0,pie_shape);
                    step_chk_arc=1;
                }
                else if(step_arc==2 || chk==3){//步骤控制
                    shape=arc2D;
                    
                    double a = Math.pow(Math.pow(input_x2-center_point_x,2)+Math.pow(input_y2-center_point_y,2),0.5);
                    double b = input_x2-center_point_x;
                    if(input_y2>center_point_y)
                        end=360+Math.acos(b/a)/Math.PI*-180-start;
                    else
                        end=Math.acos(b/a)/Math.PI*180-start;
                    if(end<0){end=360-Math.abs(end);}
                    
                    arc2D.setArc(Math.min(temp_x1,temp_x2),Math.min(temp_y1,temp_y2),Math.abs(temp_x1-temp_x2),Math.abs(temp_y1- 
temp_y2),start,end,pie_shape);
                    step_chk_arc=2;
                }
            }
            else if(drawMethod==6){//多边型
                shape=polygon;
            }
            else if(drawMethod==7 || drawMethod==8){//任意线&橡皮擦
                Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
                
                shape=line2D;
                line2D.setLine(input_x1,input_y1,input_x2,input_y2);
                if(drawMethod==7)
                    g2d_bufImg.setPaint(color_border);
                else
                    g2d_bufImg.setPaint(Color.white);
                g2d_bufImg.setStroke(stroke);
                g2d_bufImg.draw(shape);
            }
            
            else if(drawMethod==9){//文字
                Graphics2D g2d_bufImg = (Graphics2D) bufImg.getGraphics();
                FontRenderContext frc = g2d_bufImg.getFontRenderContext();
                jDialog.show();
                
                Font f = new Font(textField_font.getText(),valBold + valItalic,size);
                TextLayout tl = new TextLayout(textField_word.getText(), f, frc);
                double sw = tl.getBounds().getWidth();
                double sh = tl.getBounds().getHeight();

                AffineTransform Tx = AffineTransform.getScaleInstance(1, 1);
                Tx.translate(input_x2,input_y2+sh);
                shape = tl.getOutline(Tx);
            }
            else if(drawMethod==10){//选取工具
                shape=rectangle2D;
                rectangle2D.setRect(Math.min(input_x1,input_x2),Math.min(input_y1,input_y2),Math.abs(input_x1-input_x2),Math.abs(input_y1- 
input_y2));
            }
            if(color_border instanceof GradientPaint){//使用渐层填色读取拖拉坐标
                color_border = new GradientPaint( input_x1,input_y1, (Color)((GradientPaint)color_border).getColor1(), input_x2,input_y2,  
(Color)((GradientPaint)color_border).getColor2(), true );
            }
            if(color_inside instanceof GradientPaint){
                color_inside = new GradientPaint( input_x1,input_y1, (Color)((GradientPaint)color_inside).getColor1(), input_x2,input_y2,  
(Color)((GradientPaint)color_inside).getColor2(), true );
            }
        }
        
        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            super.paint(g2d);//重绘底层JPanel以及上面所有组件

            if(press==1 && drawMethod!=10 && !(x1<0 || y1<0)) {//绘图在最上面的JLabel上,并判断是不是起点才画
                draw(x1,y1,x2,y2);
                if(drawMethod==8) return;
                if(color_inside!=null){
                    g2d.setPaint(color_inside);
                    g2d.fill(shape);
                }
                if(color_border!=null){
                    g2d.setPaint(color_border);
                    g2d.setStroke(stroke);
                    g2d.draw(shape);
                }
            }

            if(drawMethod==10 && cut==0){//选取控制、判断是否选取、剪下、或贴上
                g2d.setPaint(Color.black);
                g2d.setStroke(basicStroke_select);
                rectangle2D_select.setRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));
                g2d.draw(rectangle2D_select);
            }
            if(cut==1){
                g2d.setPaint(Color.black);
                g2d.setStroke(basicStroke_select);
                rectangle2D_select.setRect(select_x,select_y,select_w,select_h);
                g2d.draw(rectangle2D_select);
            }
            if(cut==2){
                   g2d.drawImage(bufImg_cut,x2,y2,this);
               }

            //跟随游标的圆形//
            if(drawMethod==7 || drawMethod==8){
                g2d.setPaint(Color.black);
                g2d.setStroke(basicStroke_pen);
                ellipse2D_pan.setFrame(x2-setPanel.number/2,y2-setPanel.number/2,setPanel.number,setPanel.number);
                g2d.draw(ellipse2D_pan);
            }
        }
    }

    public static void main( String args[] ){
        try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
        catch(Exception e){e.printStackTrace();}
        
        Painter app = new Painter();
        app.setVisible(true);
        app.setExtendedState(Frame.MAXIMIZED_BOTH);
    }
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 可以使用 Swing 来创建 GUI 应用程序,因此我们可以使用 Swing 来创建一个多功能画图板程序。下面是一个简单的实现示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DrawingBoard extends JFrame implements ActionListener, MouseListener, MouseMotionListener { private JPanel canvas; private JMenuBar menuBar; private JMenu fileMenu, shapeMenu, colorMenu; private JMenuItem newMenuItem, saveMenuItem, exitMenuItem; private JMenuItem lineMenuItem, rectMenuItem, ovalMenuItem; private JMenuItem redMenuItem, greenMenuItem, blueMenuItem; private Color currentColor = Color.BLACK; private int shapeType = 0; // 0 for line, 1 for rectangle, 2 for oval private Point startPoint, endPoint; public DrawingBoard() { super("Drawing Board"); setSize(800, 600); canvas = new JPanel(); canvas.setBackground(Color.WHITE); canvas.addMouseListener(this); canvas.addMouseMotionListener(this); add(canvas); menuBar = new JMenuBar(); fileMenu = new JMenu("File"); newMenuItem = new JMenuItem("New"); saveMenuItem = new JMenuItem("Save"); exitMenuItem = new JMenuItem("Exit"); newMenuItem.addActionListener(this); saveMenuItem.addActionListener(this); exitMenuItem.addActionListener(this); fileMenu.add(newMenuItem); fileMenu.add(saveMenuItem); fileMenu.add(exitMenuItem); menuBar.add(fileMenu); shapeMenu = new JMenu("Shape"); lineMenuItem = new JMenuItem("Line"); rectMenuItem = new JMenuItem("Rectangle"); ovalMenuItem = new JMenuItem("Oval"); lineMenuItem.addActionListener(this); rectMenuItem.addActionListener(this); ovalMenuItem.addActionListener(this); shapeMenu.add(lineMenuItem); shapeMenu.add(rectMenuItem); shapeMenu.add(ovalMenuItem); menuBar.add(shapeMenu); colorMenu = new JMenu("Color"); redMenuItem = new JMenuItem("Red"); greenMenuItem = new JMenuItem("Green"); blueMenuItem = new JMenuItem("Blue"); redMenuItem.addActionListener(this); greenMenuItem.addActionListener(this); blueMenuItem.addActionListener(this); colorMenu.add(redMenuItem); colorMenu.add(greenMenuItem); colorMenu.add(blueMenuItem); menuBar.add(colorMenu); setJMenuBar(menuBar); setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource() == newMenuItem) { canvas.removeAll(); canvas.repaint(); } else if (e.getSource() == saveMenuItem) { // TODO: save the drawing to a file } else if (e.getSource() == exitMenuItem) { System.exit(0); } else if (e.getSource() == lineMenuItem) { shapeType = 0; } else if (e.getSource() == rectMenuItem) { shapeType = 1; } else if (e.getSource() == ovalMenuItem) { shapeType = 2; } else if (e.getSource() == redMenuItem) { currentColor = Color.RED; } else if (e.getSource() == greenMenuItem) { currentColor = Color.GREEN; } else if (e.getSource() == blueMenuItem) { currentColor = Color.BLUE; } } public void mousePressed(MouseEvent e) { startPoint = e.getPoint(); } public void mouseReleased(MouseEvent e) { endPoint = e.getPoint(); Graphics g = canvas.getGraphics(); g.setColor(currentColor); if (shapeType == 0) { g.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y); } else if (shapeType == 1) { int x = Math.min(startPoint.x, endPoint.x); int y = Math.min(startPoint.y, endPoint.y); int width = Math.abs(startPoint.x - endPoint.x); int height = Math.abs(startPoint.y - endPoint.y); g.drawRect(x, y, width, height); } else if (shapeType == 2) { int x = Math.min(startPoint.x, endPoint.x); int y = Math.min(startPoint.y, endPoint.y); int width = Math.abs(startPoint.x - endPoint.x); int height = Math.abs(startPoint.y - endPoint.y); g.drawOval(x, y, width, height); } } public void mouseMoved(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public static void main(String[] args) { new DrawingBoard(); } } ``` 这个程序使用了 JPanel 来创建画布,使用 JMenuBar 来创建菜单栏。菜单栏包括文件菜单、形状菜单和颜色菜单,可以选择新建、保存、退出、画直线、画矩形、画椭圆和选择颜色。根据用户的选择,可以在画布上画出不同形状和颜色的图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值