【问题标题】:Applet drawing multiple shapes instead of just one小程序绘制多个形状而不是一个
【发布时间】:2023-04-07 07:53:01
【问题描述】:

我正在创建一个小程序,让用户使用橡皮筋效果绘制不同的形状,让用户在绘制时看到形状。我想要的是让程序绘制留在屏幕上的形状。问题是,无论鼠标在哪里,程序都会绘制一个形状。

以下面的程序为例。假设用户在点 (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*/ {}
}

【问题讨论】:

  • 您必须保存最后绘制的内容,在其上绘制新事物,然后绘制整个事物。它的基本二维图形。你也必须对 HTML5 的画布做同样的事情。

标签: java applet drawing


【解决方案1】:
  1. 你打破了油漆链。未能调用super.paint 会阻止小程序准备Graphics 上下文以进行绘制,方法是删除之前可能已绘制到它的任何内容。无需覆盖 update,因为您没有对它做任何事情。
  2. 通常,您应该避免覆盖顶级容器的 paint,因为它们不是双缓冲的,并且在重新绘制时会闪烁
  3. 您应该避免使用Applet,而是使用JApplet 和(例如)JPanel 的组合作为绘图表面。事实上,如果你只是在学习。使用JFrame会更好,因为小程序有很多额外的管理
  4. 就其本质而言,绘画具有破坏性。你需要维护一个你想要绘制的东西的列表。在此,我推荐Points的List,可以用来画线,其中最后一个点就是当前拖动点

还可以查看Painting in AWT and Swing,了解有关绘画工作原理的详细信息

【讨论】:

  • 我正在做一些更新 - 这是用户如何在不消失之前绘制其他矩形的方式。
  • @Tnt 作为example
  • 现在我对 Java 有了更多的经验,我可以说你的建议对我帮助很大。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多