java中repaint()怎么样能只清除某一条线?怎么样可以不清楚原来已经画了的?
展开全部
一般来说你需要用一个数组或者其他数据结构来记录画的内容数据。然后 paint 的时候读取数组并对应地画到屏幕上。因为 paint 是不主动记录数据的,所以一旦画出来再要去掉就很麻烦,而且因为它不保存数据,所以一旦绘制区域被遮盖或者移出了屏幕区域就会整块被擦掉。
比如我举个例子,你要只画直线的话,可以用一个数组或两个数组记录两端点的坐标(如果要颜色等信息就同样可以很方便地扩展,比如加一个数组什么的)。如果一开始是不确定线条数的你就用一个 Vector 或者 ArrayList 来做个动态数组,反正把每条线的两端点都记录下来,然后删除一条线就只需要在数组中把对应的端点坐标 remove 掉,然后调用 repaint:
import java.util.Vector;
import java.awt.Graphics;
import java.awt.JPanel;
import java.awt.Point;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.KeyListener;
public class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener {
private Vector<Point> endPoints1 = new Vector<Point>();
private Vector<Point> endPoints2 = new Vector<Point>();
public MyPanel () {
addMouseListener(this);
addMouseMotionListener(this);
addKeyListener(this);
}
@Override public void paint (Graphics g) {
super.paint(g);
for (int i=0; i<endPoints1.size(); i++)
g.drawLine(endPoints1.get(i).x, endPoints1.get(i).y, endPoints2.get(i).x, endPoints2.get(i).y);
requestFocus();
}
......//其他你自己写
public void addLine (Point p1, Point p2) {
endPoints1.add(p1);
endPoints2.add(p2);
repaint(); //在这里调用 repaint
}
public void removeLine (Point p1, Point p2) {
endPoints1.remove(p1);
endPoints2.remove(p2);
repaint(); //同样在这里调用 repaint
}
}
剩下的包括选择删除哪条线之类的你自己写吧。这是一个整条线处理的例子,就是一个矢量图。如果只是位图的话那就是类似橡皮擦的工具,在屏幕上画一个和背景颜色相同的小矩形或者圆形覆盖掉那个区域就行了。
比如我举个例子,你要只画直线的话,可以用一个数组或两个数组记录两端点的坐标(如果要颜色等信息就同样可以很方便地扩展,比如加一个数组什么的)。如果一开始是不确定线条数的你就用一个 Vector 或者 ArrayList 来做个动态数组,反正把每条线的两端点都记录下来,然后删除一条线就只需要在数组中把对应的端点坐标 remove 掉,然后调用 repaint:
import java.util.Vector;
import java.awt.Graphics;
import java.awt.JPanel;
import java.awt.Point;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.KeyListener;
public class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener {
private Vector<Point> endPoints1 = new Vector<Point>();
private Vector<Point> endPoints2 = new Vector<Point>();
public MyPanel () {
addMouseListener(this);
addMouseMotionListener(this);
addKeyListener(this);
}
@Override public void paint (Graphics g) {
super.paint(g);
for (int i=0; i<endPoints1.size(); i++)
g.drawLine(endPoints1.get(i).x, endPoints1.get(i).y, endPoints2.get(i).x, endPoints2.get(i).y);
requestFocus();
}
......//其他你自己写
public void addLine (Point p1, Point p2) {
endPoints1.add(p1);
endPoints2.add(p2);
repaint(); //在这里调用 repaint
}
public void removeLine (Point p1, Point p2) {
endPoints1.remove(p1);
endPoints2.remove(p2);
repaint(); //同样在这里调用 repaint
}
}
剩下的包括选择删除哪条线之类的你自己写吧。这是一个整条线处理的例子,就是一个矢量图。如果只是位图的话那就是类似橡皮擦的工具,在屏幕上画一个和背景颜色相同的小矩形或者圆形覆盖掉那个区域就行了。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询