一个简单的画板应用程序,用户可以通过鼠标在画板上自由绘制任意大小的矩形或椭圆。
用户通过点击按钮,选择要绘制的矩形(rect)或者椭圆(oval),以及选择画笔的颜色(红色、蓝色、以及黑色)。绘制完成后,用户可以通过点击菜单条上的file菜单下的sava选项进行保存。
程序具体效果图:注意:
1.画笔的默认颜色为黑色。
2.需要先点击rect(矩形)或者oval(椭圆)按钮再进行绘制。
3.保存绘制的图形时,文件的后缀名应为jpg格式(即在文件名后面加上.jpg)。
4.矩形椭圆均为填充图形。
具体实现过程且看以下代码(代码内部有详细的注解)。 代码:import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import static javax.swing.WindowConstants.EXIT_ON_CLOSE; public class PaintTest { //创建一个窗口 private Jframe f=new Jframe("画板"); //定义一个菜单条以及菜单和菜单项 private JMenuBar jMenuBar; private JMenu file; private JMenuItem save=new JMenuItem("save");; //设置窗口大小 private final int TABLE_HEIGHT=500; private final int TABLE_WIDTH=500; //初始化鼠标起始位置 private int preX=-1; private int preY=-1; //获取鼠标松开位置 private int lastX; private int lastY; //初始图形长宽; private int height; private int width; //初始化颜色; private Color color=Color.BLACK; //颜色按钮 JButton red =new JButton("red"); JButton blue =new JButton("blue"); JButton black =new JButton("black"); //矩形椭圆按钮 JButton rect=new JButton("rect"); JButton oval=new JButton("oval"); //定义一个变量获取需要画的图形; String str=""; //获取一个BufferedImage对象,调用该对象中的方法获取画笔 BufferedImage image=new BufferedImage(TABLE_WIDTH,TABLE_HEIGHT,BufferedImage.TYPE_INT_BGR); Graphics g=image.getGraphics(); //定义一个方法用于初始化变量 public void initialize(){ this.preX=-1; this.preY=-1; this.lastX=-1; this.lastY=-1; } //创建一个画布 private class MyCanvas extends JPanel{ @Override public void paint(Graphics g) { //画位图,将本机图片复制到画布上去 g.drawImage(image,0,0,null); if(str.equals("绘制矩形")){ g.setColor(color); g.fillRect(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY)); }else if(str.equals("绘制椭圆")){ g.setColor(color); g.fillOval(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY)); } } } MyCanvas myDraw=new MyCanvas(); //自定义点击按钮发生颜色变化的方法 private void setColor(Color redColor,Color blueColor,Color blackColor){ red.setBackground(redColor); blue.setBackground(blueColor); black.setBackground(blackColor); } private void setColor(Color rectColor,Color ovalColor){ rect.setBackground(rectColor); oval.setBackground(ovalColor); } //组装视图 public void init(){ JPanel colorGroup=new JPanel(); colorGroup.add(red); colorGroup.add(blue); colorGroup.add(black); JPanel graphGroup=new JPanel(); graphGroup.add(rect); graphGroup.add(oval); //定义一个点击事件处理器 ActionListener actionListener=new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取点击的内容 String actionCommand = e.getActionCommand(); //switch语句用于处理点击不同内容的事件处理 switch (actionCommand){ case "red": //设置按钮颜色 setColor(Color.RED,Color.WHITE,Color.WHITE); //设置画笔颜色 color=Color.RED; break; case "blue": setColor(Color.WHITE,Color.BLUE,Color.WHITE); color=Color.BLUE; break; case "black": setColor(Color.WHITE,Color.WHITE,Color.BLACK); color=Color.BLACK; break; case "rect": str="绘制矩形"; //初始化变量 initialize(); setColor(Color.YELLOW,Color.WHITE); break; case "oval": str="绘制椭圆"; //初始化变量 initialize(); setColor(Color.WHITE,Color.YELLOW); break; case "save": //保存画的图形 FileDialog fileSave=new FileDialog(f,"open",FileDialog.SAVE); fileSave.setVisible(true); //获取文件名和文件位置 String file = fileSave.getFile(); String directory = fileSave.getDirectory(); try { //解决空指针异常 if(file==null||directory==null){ return; } ImageIO.write(image,"JPEG" ,new File(directory,file)); } catch (IOException ioException) { ioException.printStackTrace(); } break; } } }; //添加事件处理器 red.addActionListener(actionListener); blue.addActionListener(actionListener); black.addActionListener(actionListener); rect.addActionListener(actionListener); oval.addActionListener(actionListener); save.addActionListener(actionListener); //设置画板为白色 g.setColor(Color.white); g.fillRect(0,0,TABLE_WIDTH,TABLE_HEIGHT); //画布添加鼠标事件处理 myDraw.addMouseListener(new MouseAdapter() { @Override //鼠标按下事件处理,用于获取鼠标按下时的位置 public void mousePressed(MouseEvent e) { preX=e.getX(); preY=e.getY(); } //松开事件处理,用于获取鼠标松开后的位置 public void mouseReleased(MouseEvent e) { lastX=e.getX(); lastY=e.getY(); //在image画布上画出相应图形 if(str.equals("绘制矩形")){ g.setColor(color); g.fillRect(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY)); initialize(); }else if (str.equals("绘制椭圆")){ g.setColor(color); g.fillOval(Math.min(preX,lastX),Math.min(preY,lastY),Math.abs(lastX-preX),Math.abs(lastY-preY)); initialize(); } } }); //鼠标移动事件处理 myDraw.addMouseMotionListener(new MouseMotionAdapter() { @Override //鼠标拖动事件处理,获取鼠标拖动实时位置 public void mouseDragged(MouseEvent e) { lastX=e.getX(); lastY=e.getY(); myDraw.repaint(); } }); //设置画布大小 myDraw.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT)); //添加画布 f.add(myDraw); //组装并添加菜单条 jMenuBar=new JMenuBar(); file=new JMenu("file"); file.add(save); jMenuBar.add(file); f.setJMenuBar(jMenuBar); //将颜色按钮,图形按钮分别位于窗口的北方和南方 f.add(colorGroup,BorderLayout.NORTH); f.add(graphGroup,BorderLayout.SOUTH); //设置窗口为一个合适大小 f.pack(); //设置窗口关闭功能 f.setDefaultCloseOperation(EXIT_ON_CLOSE); f.setVisible(true); } public static void main(String[] args) { new PaintTest().init(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)