画图板及重绘

[size=medium]一.简单画图板
1.首先是一个简单的可以画直线的画图板需要用到监听器和画布
新组件:
靠鼠标的移动产生直线:MouseListener
需要在画布上作图:Graphics
关键字:this用于在构造方法中引用满足指定参数类型的构造器,但只能引用一个构造方法且必须位于开始
2. 鼠标监听器:
Mouse1类:[/size]
 //定义一个Mouse1类实现鼠标监听器中的抽象方法
public class Mouse1 implements MouseListener,MouseMotionListener{
//因为和主函数中的画板联系,所以不可用Graphics g=new Graphics();
private Graphics g;
int x1,y1,x2,y2;
//传参:需要在画布上画线,所以需要传参
public Mouse1(Graphics g){
this.g=g;
}
//鼠标被按下时
public void mousePressed(MouseEvent e){
x1=e.getX();//得到第一个点的横坐标
y1=e.getY();//得到第一个点的纵坐标
}
//鼠标拖动,产生边画边现实的效果,因为要擦去拖动过程产生的线,所以要用背景色重绘一遍
//利用临时变量储存终点
private int tempx=0,tempy=0;
public void mouseDragged(MouseEvent e){
x2=e.getX();//得到第二个点的横坐标
y2=e.getY();//得到第二个点的纵坐标
//画直线
g.drawLine(x1, y1, x2, y2);
//利用临时变量绘制背景线,详细代码与画彩线类似
tempx=shape.x2;
tempy=shape.y2;


//鼠标被释放后
public void mouseReleased(MouseEvent e){


[size=medium]主函数:[/size]
(画布位于窗体上方,需申请得到)
//申请得到画布
Graphics gr=jf2.getGraphics();
//声明鼠标监听器
Mouse1 mouse1=new Mouse1(gr);
//添加鼠标监听器
jf2.addMouseListener(mouse1);
jf2.addMouseMotionListener(mouse1);
[size=medium]二.可以选择图形的画板
1.新组件
动作监听器:ActionListener
颜色选项:Color c=new Color(66,6,2);
数学函数:如x3=Math.min(x1, x2);//x1,x2的最小值
2.通过选择不同的按钮画出不同的形状:动作监听器
ActionChoose类:[/size]
  //通过ActionChoose实现动作监听器
public class ActionChoose implements ActionListener{
//通过按钮的不同来得到不同的画图标识
private String command;
//用getCommand方法得到类型
public String getCommand()
{
return command;
}
public void actionPerformed(ActionEvent e){
//根据不同的按钮类型赋给command不同的值进行画线的判断
if(e.getActionCommand().equals("直线"))
{
command = "line";
}
````
}
}
[size=medium]主函数:[/size]
 //声明动作选择监听器
ActionChoose acc=new ActionChoose();
//设置图形按钮
JRadioButton line=new JRadioButton("直线");
//添加监听器
line.addActionListener(acc);
//在Mouse1中需要根据ActionChoose的选择进行判断所画图形形状
Mouse1 mouse1=new Mouse1(gr,acc);
Mouse1类:
 public class Mouse1 implements MouseListener{
private Graphics g;
private ActionChoose ac;
int x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x7,y7;
//传参
public Mouse1(Graphics g,ActionChoose ac){
this.g=g;
this.ac = ac;
}
//根据加到按钮监听器对象得到选择按钮的类型进行判断画图
String nValue = ac.getCommand();
//直线
if(nValue.equals("line"))
g.drawLine(x1, y1, x2, y2);
}
[size=medium]三.关于画图
扩展思维
·线可以组成三角形,箭头等;
·多个平面图形的重复累加可形成立体图形;
·多个线条可形成立体图形;
·通过对图形颜色的控制可以画出立体效果;
四.关于画图板的重绘
在改变窗体大小或移动除桌面时,图形会消失。这是因为所绘图形保存在缓存而不是内存中,所以,改变窗体后,只显示窗体,不显示图形。在JFrame中,有paint方法,系统会自动调用,因此,如果想重绘图形,则要重写paint方法,是指可以画出之前的图形,即遍历所画图形。利用队列保存图形,再利用paint重绘。[/size] //注意写在JFrame中
public void paint(Graphics g){
//重写窗体,否则不显示窗体
super.paint(g);
for(int i=0;i<shapelist1.size();i++){
Shape shape=shapelist1.get(i);
g.getColor();
shape.draw(g);
}
//每放开鼠标一次,保存一次
public void mouseReleased(MouseEvent e){
//要在内部定义,否则只保存最后一个图形
Shape shape = new Shape();
shape.x1=x1;
shape.y1=y1;
shape.x2=e.getX();
shape.y2=e.getY();
shape.color = jcc.getColor();
shape.type=nValue;
//保存图形
shapelist.add(shape);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值