java 绘图板 如何实现画直线的功能 200
目前正在做一个绘图板,在实现画直线功能的时候遇到点问题。我想实现的画直线功能不是鼠标点一下做起点,再点一下做终点,生成直线的。而是点一下做固定起点后,鼠标拖动,整条线随着...
目前正在做一个绘图板,在实现画直线功能的时候遇到点问题。我想实现的画直线功能不是鼠标点一下做起点,再点一下做终点,生成直线的。而是点一下做固定起点后,鼠标拖动,整条线随着鼠标移动而变化,当然了,起点是一直固定的。
如果在鼠标拖曳监听中放这样一段代码:(注:startX、startY是线的起点的坐标,用鼠标按下监听获得,preX,preY是上一个点的坐标。)
g.drawLine(startX, startY, preX, preY);
preX=e.getX();
preY=e.getY();
随着鼠标的拖曳,电脑不断画出新的线。
原理是鼠标拖曳移动的过程中e.getX()和e.getY(),也就是鼠标的坐标不断变化,画布上就不断地画出新的线。
后来在网上找了解决的方法,那就是用背景色的线来覆盖原来画的线,简单点说就是,移动鼠标的过程中,会不断画新的黑色的线,画第n条黑线的同时,就会在n-1黑线的位置画一条白线,用来覆盖n-1位置的黑线,就使上一条线消失了。
监听中的代码如下:
g.setColor(foreColor);//获取前景色,准备画新线
g.drawLine(startX, startY, e.getX(), e.getY());//画新的线
if(preX!=e.getX()||preY!=e.getY()){
g.setColor(backColor);//获取背景色,准备覆盖旧线
g.drawLine(startX, startY, preX, preY);//画一条与背景色相同的线覆盖上一条线
}
setPre(e);
好吧,扯了这么多,我的问题也来了,就是因为我用与背景色相同的线来覆盖旧线,通过这个原理确实可以画一条可以拖动的直线,问题是,假如原本画布上就已经有图案了,那当我的线扫过那个图案的时候,用背景色的线覆盖旧线的时候,其实就把那图案也覆盖了。我纠结的就是这个问题。
如图:鼠标一拖动,就会不断画黑色的新线,同时,画白色的旧线覆盖上一条黑线,但如果原本就有图案,那白线就会把原本的图案也覆盖了。 展开
如果在鼠标拖曳监听中放这样一段代码:(注:startX、startY是线的起点的坐标,用鼠标按下监听获得,preX,preY是上一个点的坐标。)
g.drawLine(startX, startY, preX, preY);
preX=e.getX();
preY=e.getY();
随着鼠标的拖曳,电脑不断画出新的线。
原理是鼠标拖曳移动的过程中e.getX()和e.getY(),也就是鼠标的坐标不断变化,画布上就不断地画出新的线。
后来在网上找了解决的方法,那就是用背景色的线来覆盖原来画的线,简单点说就是,移动鼠标的过程中,会不断画新的黑色的线,画第n条黑线的同时,就会在n-1黑线的位置画一条白线,用来覆盖n-1位置的黑线,就使上一条线消失了。
监听中的代码如下:
g.setColor(foreColor);//获取前景色,准备画新线
g.drawLine(startX, startY, e.getX(), e.getY());//画新的线
if(preX!=e.getX()||preY!=e.getY()){
g.setColor(backColor);//获取背景色,准备覆盖旧线
g.drawLine(startX, startY, preX, preY);//画一条与背景色相同的线覆盖上一条线
}
setPre(e);
好吧,扯了这么多,我的问题也来了,就是因为我用与背景色相同的线来覆盖旧线,通过这个原理确实可以画一条可以拖动的直线,问题是,假如原本画布上就已经有图案了,那当我的线扫过那个图案的时候,用背景色的线覆盖旧线的时候,其实就把那图案也覆盖了。我纠结的就是这个问题。
如图:鼠标一拖动,就会不断画黑色的新线,同时,画白色的旧线覆盖上一条黑线,但如果原本就有图案,那白线就会把原本的图案也覆盖了。 展开
2个回答
展开全部
这个简单
可以调用方法drawline(int x1, int y1, int x2, int y2)
其中(x1, y1), (x2, y2)分别为直线起点和终点的坐标
特意给你写了个小例子,希望能帮到你
***************************************
import javax.swing.*;
import java.awt.*;
public class DrawLine extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame("DrawLine");
frame.getContentPane().add(new DrawLine());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(50, 50, 200, 250);
}
}
****************************
将程序复制到记事本中并改名为DrawLine.java(注意大小写)
然后在命令行中用 CD+文件夹高源 使命令范围到铅念散DrawLine.java的槐氏文件夹中
然后执行命令javac DrawLine.java
再执行命令java DrawLine
你会看到结果
可以调用方法drawline(int x1, int y1, int x2, int y2)
其中(x1, y1), (x2, y2)分别为直线起点和终点的坐标
特意给你写了个小例子,希望能帮到你
***************************************
import javax.swing.*;
import java.awt.*;
public class DrawLine extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame("DrawLine");
frame.getContentPane().add(new DrawLine());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(50, 50, 200, 250);
}
}
****************************
将程序复制到记事本中并改名为DrawLine.java(注意大小写)
然后在命令行中用 CD+文件夹高源 使命令范围到铅念散DrawLine.java的槐氏文件夹中
然后执行命令javac DrawLine.java
再执行命令java DrawLine
你会看到结果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2016-04-23 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
你的问题有个不够清晰的地方。当你鼠标按下时是否就影响了当前图像的内容?还是在鼠标抬起后才影响图像?举个例子:画笔在FreeDraw的时候按下鼠标既改变了当前图画,无论你合适抬起鼠标被覆盖的部分已经确定了。而当你要插入一张图片的时候只有在调整完插入图片的大小和位置后才会改变当前图画。
如果你的需求是第一种,让知那么很简单判断鼠标按下开始画,鼠标抬起结束就可以了。
如果你的需求是第二种,那么可以使用图层的概念。鼠标按下时建立一个临时图层的Image,并在这个临时图层坦吵消上画,在画布刷新时,先draw正式图层碰败,在draw临时图层。当鼠标抬起时将两个图层合并就可以了。
如果你的需求是第一种,让知那么很简单判断鼠标按下开始画,鼠标抬起结束就可以了。
如果你的需求是第二种,那么可以使用图层的概念。鼠标按下时建立一个临时图层的Image,并在这个临时图层坦吵消上画,在画布刷新时,先draw正式图层碰败,在draw临时图层。当鼠标抬起时将两个图层合并就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |