小程序绘制多个形状而不是一个

时间:2014-05-13 22:42:38

标签: java applet drawing

我正在创建一个applet,让用户可以使用橡皮筋效果绘制不同的形状,让用户在绘制时看到形状。我想要的是程序绘制留在屏幕上的形状。问题是程序在鼠标所在的任何地方都会绘制一个形状。

以下面的程序为例。假设用户在点(50,50)处单击小程序并拖动鼠标以在(70,70)处绘制一个右下角的矩形。程序将在最终矩形内绘制几个矩形(即右下角为(54,56),(63,61)等的矩形)。我只希望显示最终的矩形,同时还要使用橡皮筋效果。如果用户要绘制第二个矩形,则当用户绘制第二个矩形时,第一个矩形将保留在屏幕上。

如何更改代码才能使其正常工作?

import java.awt.Graphics;
import java.awt.event.*;

public class Test extends java.applet.Applet implements MouseListener, MouseMotionListener {
    int downX, downY, dragX, dragY;

    public void init() {
        downX = downY = dragX = dragY = 0;

        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public void paint(Graphics g) {
        g.drawRect(downX,downY,dragX-downX,dragY-downY);
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void mouseClicked(MouseEvent e) {
        downX = e.getX();
        downY = e.getY();
    }

    public void mouseDragged(MouseEvent e) {
        dragX = e.getX();
        dragY = e.getY();
        repaint();
    }

    public void /*Other MouseEvent methods*/ {}
}

1 个答案:

答案 0 :(得分:0)

  1. 你打破了油漆链。未能调用super.paint会阻止小程序准备Graphics上下文以进行绘制,方法是删除之前可能已绘制的任何内容。我们无需覆盖update,因为您没有对其进行任何操作。
  2. 通常,您应该避免覆盖paint顶级容器,因为它们不会被双重缓冲,并且会在重新绘制时闪烁
  3. 您应避免使用Applet,而应使用JApplet a(例如)JPanel的组合作为绘图表面。事实上,如果你只是在学习。最好使用JFrame,因为applet有很多额外的管理
  4. 绘画本质上具有破坏性。您需要维护要绘制的事物列表。在这里,我建议使用List Point个{{1}},可用于绘制线条,最后一个点是当前拖动点
  5. 另请参阅Painting in AWT and Swing了解有关绘画如何运作的详细信息