想实现一个画板,那请你想想要分几步骤呢?
第一:画板是不是要有大致的样子呢?
第二:画板是不是要有属于它的组件呢?
第三:画板是不是要实现功能呢?
第四:画板的完善工作
根据上面几个步骤,一起来思考该怎么实现画板吧!
第一步:
新建一个窗体,在窗体上实现布局,布局就要用到面板,那么在这里我就在窗体上添加三个面板,他们分别是jpwest(放在窗体左边的面板)、jpsouth(放在窗体下面的面板)、jpcenter(放在窗体中间的面板),他们分别是类Jpwest、Jpsouth、Jpcenter的一个实例对象,这三个类是继承了JPanel的子类
三个面板的类分别为:
public class Jpwest extends JPanel{}
public class Jpsouth extends JPanel {}
public class Jpcenter extends JPanel {}
三个类的构造函数大家就自己写吧
Jpwest jpwest = new Jpwest();Jpsouth jpsouth = new Jpsouth();Jpcenter jpcenter = new Jpcenter();//窗体添加面板this.add(jpwest,BorderLayout.WEST);this.add(jpsouth,BorderLayout.SOUTH);this.add(jpcenter);//可调用面板的函数jpwest.initpanel();jpsouth.initpanel();jpcenter.initpanel();
第二步:
给窗体添加相应的组件:按钮等等
这里只是给出参照的部分代码
package DrawBorder;import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JRadioButton;public class Jpwest extends JPanel{public ButtonGroup bg = new ButtonGroup();
public void initpanel(){this.setBackground(Color.pink);//设置面板的背景颜色//设置面板的大小Dimension dim = new Dimension(50,70);this.setPreferredSize(dim);//设置面板的布局FlowLayout fl = new FlowLayout(FlowLayout.CENTER,0,0);this.setLayout(fl);//创建按钮组件for(int i=0;i<16;i++){JRadioButton jrb = new JRadioButton();//兴趣小问题:为什么这里用JRadioButton而不是Button?this.add(jrb);//给按钮设置命令jrb.setActionCommand("images"+i);bg.add(jrb);//给按钮插入图片,每个按钮有四种状态图片ImageIcon icon1 = new ImageIcon("image/draw"+i+".jpg");ImageIcon icon2 = new ImageIcon("image/draw"+i+"-1.jpg");ImageIcon icon3 = new ImageIcon("image/draw"+i+"-2.jpg");ImageIcon icon4 = new ImageIcon("image/draw"+i+"-3.jpg");//添加状态图片jrb.setIcon(icon1);jrb.setRolloverIcon(icon2);jrb.setPressedIcon(icon3);jrb.setSelectedIcon(icon4);jrb.setBorder(null);}
}
}
窗体左边的面板加上了按钮之后,还要给窗体下面部分的面板添加颜色按钮
(这里我只添加一个颜色按钮,只是做一个技术上的示范)
package DrawBorder;import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;public class Jpsouth extends JPanel {//利用构造函数传递对象public DrawBorder db;public Jpsouth(DrawBorder db1){db = db1;}//面板类中将被用来调用的函数
public void initpanel(){//设置面板额颜色和大小this.ay);Dimension dim = new Dimension(50,70);this.setPreferredSize(dim);//创建颜色按钮final JButton jb1 = new JButton();jb1.setPreferredSize(new Dimension(20,20));//给按钮设置颜色,代表这种颜色按钮jb1.);//创建设置按钮阴影的对象BevelBorder bb = new BevelBorder(1,Color.ay);//在按钮上添加这个对象,实现按钮下凹的效果jb1.setBorder(bb);//在这个面板上添加上颜色按钮,这里只创建了一个按钮,剩下的按钮自己可以去实现,同时可以思考用什么方法可以简便的实现所以的按钮this.add(jb1);//设置监听//ActionListener action = new ActionListener(){//public void actionPerformed(ActionEvent e){// db.color = Background();// }//};//按钮添加监听//jb1.addActionListener(action);}
}
第三步:实现画板的各种功能(最关键的一步)
想实现画板的功能其实就是实现各种组件的功能,那么这里就需要用到很多监听的技术了;要实现画板功能我们第一时间想到的是不是画画需要什么,是的,画画需要的是画笔,那么思考要怎么得到画笔呢?
在这里大家可以去了解一下
package DrawBorder;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
Collator;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import java.awt.Dimension;public class DrawBorder extends JFrame{public Color color = ;public ArrayList<Shapes> ShapesList = new ArrayList<Shapes>();public static void main(String[] args){DrawBorder db = new DrawBorder();//创建画板的窗体对象db.initFrame();
}
public void initFrame(){//窗体的基本设置this.setSize(500,500);//设置窗体大小this。setSize()this.setDefaultCloseOperation(3);//窗体关闭设置BorderLayout bl = new BorderLayout();//边框布局this.setLayout(bl);//设置窗体的布局//添加面板JpanelJpwest jpwest = new Jpwest();Jpsouth jpsouth = new Jpsouth(this);//将db这个对象以this的形式作为形参传给面板Jpcenter jpcenter = new Jpcenter(this);//将db这个对象以this的形式作为形参传给面板//窗体添加面板this.add(jpwest,BorderLayout.WEST);this.add(jpsouth,BorderLayout.SOUTH);this.add(jpcenter);//可调用面板的函数jpwest.initpanel();jpsouth.initpanel();jpcenter.initpanel();//设置可见this.setVisible(true);//visible后面要做的事final Graphics g = Graphics();//用一个Graphics的类的对象存放一个铅笔。问题是为什么要用final修饰DrawListener dl = new DrawListener(g,jpwest.bg,this);//创建DrawListener对象jpcenter.addMouseListener(dl);//在面板上添加鼠标监听jpcenter.addMouseMotionListener(dl);//给面板添加监听对象}}
这里有几个小问题,大家有兴趣的可以去思考一下:为什么不创建画笔对象,而只是给个存储对象?为什么得到画笔的前面要用final修饰?为什么得到画笔要放在this.setVisible(true)之后?
画笔得到了,接下来实现画图的功能,要在面板上画图,鼠标的移动就相当于画笔的移动,那么在这里就需要对鼠标添加监听,最后在相应的类里面设置好按钮的监听,这里用到的是MouseListener和MouseMotionListener这两个接口,在这里几不再重复接口的特点和注意事项了,如果不清楚的话可以看上一篇博客,“Java小基础”里有详细的介绍
这里要注意:保证监听的坐标系和绘图的坐标系一致
package DrawBorder;import java.awt.AWTException;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Stroke;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.Random;import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;public class DrawListener implements MouseListener,MouseMotionListener{
public int x1,y1,x2,y2,x3,y3,x4,y4;//坐标
public Graphics2D g;//画笔
public String command;
public ButtonGroup bg;//按钮组
public DrawBorder db;//用来接受传递过来的DrawBorder对象
boolean flag = true;
public Random ran = new Random();//创建随机对象
//构造函数
public DrawListener(Graphics g1,ButtonGroup bg1,DrawBorder db1){Graphics2D g2 = (Graphics2D)g1;bg = bg1;g = g2;db = db1;}//实现鼠标的拖拉public void mouseDragged(MouseEvent e) {//若鼠标点击的是图片6的按钮,实现画直线的功能if("image6".equals(command)){//得到点的坐标x2 = e.getX();y2 = e.getY();//画直线g.drawLine(x1, y1, x2, y2);x1 = x2;y1 = y2;}//若鼠标点击的是图片7的按钮else if("image7".equals(command)){//构造一个具有指定线条宽度以及 cap 和 join 风格的默认值的实心 BasicStrokeStroke strock =new BasicStroke(10);g.getStroke();//得到点的坐标x2 = e.getX();y2 = e.getY();//画直线g.drawLine(x1, y1, x2, y2);x1 = e.getX();y1 = e.getY();strock = new BasicStroke(1);g.setStroke(strock);}//若鼠标点击的是图片2的按钮else if("image2".equals(command)){//构造一个具有指定线条宽度以及 cap 和 join 风格的默认值的实心 BasicStrokeStroke strock = new BasicStroke(10);g.setStroke(strock);//获取画笔的颜色Color color = g.getColor();g.setColor(Color.white);//获取点的坐标x2 = e.getX();y2 = e.getY();//画直线g.drawLine(x1, y1, x2, y2);//转换坐标x1 = x2;y1 = y2;//构造一个具有指定线条宽度以及 cap 和 join 风格的默认值的实心 BasicStrokestrock = new BasicStroke(1);g.setStroke(strock);//获取颜色g.setColor(color);}//若鼠标点击的是图片8的按钮,实现喷漆else if("image8".equals(command)){x2 = e.getX();y2 = e.getY();//喷漆是许多小点组成的for(int i=0;i<200;i++){int value1 = Int(30)-15;//获取圆心int value2 = Int(30)-15;//画直线g.drawLine(x2+value1, y2+value2, x2+value1, y2+value2);}}}//鼠标的点击public void mouseClicked(MouseEvent e) {int count = e.getClickCount();//获取鼠标点击的次数//判断鼠标点击的次数是否等于2,if(count==2){//判断鼠标点击的是图片13的按钮if("image13".equals(command));{//获取点的坐标x2 = e.getX();y2 = e.getY();//画直线g.drawLine(x4, y4, x2, y2);//将flag标志改变flag = true;}}}//鼠标按下public void mousePressed(MouseEvent e) {//获取鼠标按下的点的坐标x1 = e.getX();y1 = e.getY();ButtonModel bm = bg.getSelection();//ButtonModel是一个接口,在按钮的上方按下鼠标使得模型既被选中又被按下command = bm.getActionCommand();//获得commandg.lor);}public void mouseReleased(MouseEvent e) {//获得鼠标释放的点的坐标x2 = e.getX();y2 = e.getY();//若鼠标点击的是图片10的按钮if("image10".equals(command)){g.drawLine(x1, y1, x2, y2);}//若鼠标点击的是图片12的按钮,实现画矩形else if("image12".equals(command)){g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));}//若鼠标点击的是图片14的按钮,实现画椭圆else if("image14".equals(command)){g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));}//若鼠标点击的是图片13的按钮,实现画多边形else if("image13".equals(command)){//根据flag判断是否要进行多边形最后的封闭if(flag){g.drawLine(x1, y1, x2, y2);x4 = x1;y4 = y1;flag = false;}else{g.drawLine(x3, y3, x2, y2);}x3 = x2;y3 = y2;}//若鼠标点击的是图片4的按钮else if("image4".equals(command)){//获得屏幕上的坐标x2 = e.getYOnScreen();y2 = e.getYOnScreen();try {Robot robot = new Robot();//创建矩形对象Rectangle rect = new Rectangle(x2,y2,1,1);//根据矩形获取缓冲截图BufferedImage bi = ateScreenCapture(rect);//获取当前图片 像素颜色int c = bi.getRGB(0, 0);//把int表示的值再转化为颜色ColorColor color = new Color(c);g.setColor(color);//g.drawImage()} catch (AWTException e1) {e1.printStackTrace();}} }public void mouseMoved(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}
<pre name="code" class="html">package DrawBorder;import java.awt.Color;
import java.awt.Graphics;import javax.swing.JPanel;public class Jpcenter extends JPanel {DrawBorder db;
public Jpcenter(DrawBorder db1){db = db1;}public void initpanel(){this.setBackground(Color.white);
}
//paint方法的实现
public void paint(Graphics g){super.paint(g);//这里将将所画的图形都存放在队列里面//要使得图形不消失,那么就要调用paint方法,遍历队列,从内存中还原图形for(int i = 0;i<db.ShapesList.size();i++){Shapes shape = (i);g.lor);//判断图形的形状pe ==10){g.drawLine(shape.x1,shape.y1, shape.x2, shape.y2);}else pe == 12){g.drawRect(Math.min(shape.x1, shape.x2), Math.min(shape.y1, shape.y2), Math.abs(shape.x1-shape.x2), Math.abs(shape.y1-shape.y2));}}
}
}
初步了解了关于画板的一些知识可能还不能很好地去真正掌握那些技巧和方法,跪在坚持学,多想想有木有其他的解决办法,尝试就会有收获!
本文发布于:2024-02-02 19:31:08,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170687347345953.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |