我在显示所有三角形时遇到问题。我用鼠标拖动画一个三角形。每次我画一个新的三角形,前一个三角形都消失了。如何使三角形保持不变,因此绘图面板上会有很多三角形?
.....
private class PaintSurface extends JComponent {
Point startDrag, endDrag, midPoint;
Polygon triangle;
public PaintSurface() {
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
startDrag = new Point(e.getX(), e.getY());
endDrag = startDrag;
repaint();
}
public void mouseReleased(MouseEvent e) {
Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());
shapes.add(r);
if (startDrag.x > endDrag.x)
midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
else
midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
int[] xs = { startDrag.x, endDrag.x, midPoint.x };
int[] ys = { startDrag.y, startDrag.y, midPoint.y };
triangle = new Polygon(xs, ys, 3);
startDrag = null;
endDrag = null;
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
endDrag = new Point(e.getX(), e.getY());
repaint();
}
});
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
paintBackground(g2);
Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
int colorIndex = 0;
g2.setStroke(new BasicStroke(1));
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
g2.fillPolygon(triangle);
}
}
答案 0 :(得分:3)
您在屏幕上看到的是您在绘画功能中绘制的内容。目前,您只在三角形变量中存储一个三角形,不断更换和绘制它。
您需要的是存储三角形列表,并在每次添加新的三角形时再添加到鼠标列表中。以下是要改变的内容:
private class PaintSurface extends JComponent {
...
//Polygon triangle;
List<Polygon> triangles = new LinkedList<Polygon>();
...
public PaintSurface() {
public void mouseReleased(MouseEvent e) {
...
//triangle = new Polygon(xs, ys, 3);
triangles.add( new Polygon(xs, ys, 3); );
...
}
});
...
}
public void paint(Graphics g) {
...
//g2.fillPolygon(triangle);
for (Polygon triangle : triangles) g2.fillPolygon(triangle);
...
}
}
答案 1 :(得分:1)
Polygon triangle;
您可以引用一个三角形对象的总计,因此每次重绘画布时,您都会绘制一个多边形。
一些解决方案:
Polygon
个对象列表,并在调用paint
时全部绘制它们。您的鼠标侦听器会在列表中添加一个新条目。答案 2 :(得分:1)
不是很奇怪。您有一个三角形对象,一旦开始绘制新三角形,就会覆盖它。
创建一个三角形阵列/列表,让你的绘图程序绘制它。
我的java修改:
.....
private class PaintSurface extends JComponent {
Point startDrag, endDrag, midPoint;
List triangles = new ArrayList();
public PaintSurface() {
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
startDrag = new Point(e.getX(), e.getY());
endDrag = startDrag;
repaint();
}
public void mouseReleased(MouseEvent e) {
Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());
shapes.add(r);
if (startDrag.x > endDrag.x)
midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
else
midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
int[] xs = { startDrag.x, endDrag.x, midPoint.x };
int[] ys = { startDrag.y, startDrag.y, midPoint.y };
Polygon triangle = new Polygon(xs, ys, 3);
traingles.add(triangle);
startDrag = null;
endDrag = null;
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
endDrag = new Point(e.getX(), e.getY());
repaint();
}
});
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
paintBackground(g2);
Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
int colorIndex = 0;
g2.setStroke(new BasicStroke(1));
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
Iterator iter = triangles.iterator();
while( iter.hasNext() ) {
g2.fillPolygon((Polygon)iter.next());
}
}
}