java - 在 Swing 中不同类的 JPanel 上绘画

标签 java swing

我目前正在为我的学士论文研究一个测试驱动的交互式 2D 流体动力学模拟。基本思想是用户可以在他的屏幕上绘制形状,程序将模拟流体如何围绕这些形状流动。 到目前为止,我只是开始了绘画过程,我已经遇到了一些小问题。

First, here is a little UML diagram that shows my project structure so far

如您所见,我创建了一个 Painter 类,它可以访问多个形状,并将根据形状类型调用其中一种抽象绘制方法。然后是继承Painter类的SwingPainter类,实现了三个paint方法和clear方法。 这是我的 SwingPainter 的代码:

public class SwingPainter extends Painter {

    private final GraphicPanel graphicPanel;

    public SwingPainter(GraphicPanel graphicPanel) {
        this.graphicPanel = graphicPanel;
    }

    private Graphics getGraphics() {
        return graphicPanel.getGraphics();
    }

    @Override
    protected void paintLine(Point start, Point end) {
        getGraphics().drawLine(start.getX(), start.getY(), end.getX(), end.getY());
    }

    @Override
    protected void paintRectangle(Point start, Point end) {
        int minX = start.getX() < end.getX() ? start.getX() : end.getX();
        int minY = start.getY() < end.getY() ? start.getY() : end.getY();
        int width = Math.abs(start.getX() - end.getX());
        int height = Math.abs(start.getY() - end.getY());
        getGraphics().drawRect(minX, minY, width, height);
    }

    @Override
    protected void paintCircle(Point center, double radius) {
        int minX = center.getX() - (int) radius;
        int minY = center.getY() - (int) radius;
        int diameter = (int) radius * 2;
        getGraphics().drawOval(minX, minY, diameter, diameter);
    }

    @Override
    public void clear() {
        graphicPanel.paintComponent(getGraphics());
    }
}

所以我的问题是 GraphicPanelPresenter(参见 UML 图)负责在用户左键单击或移动鼠标时将 Painter/Visitor 传递给形状(例如,一条线的第二个点将跟随光标)。这意味着实际的绘制是在 Swing 的绘制方法之外完成的。结果,我在绘画时遇到了一些闪烁,我想知道是否有人知道如何在不将整个画家/访客功能扔出窗外的情况下解决这个问题(因为还有其他关于形状的功能仍然需要实现并且可以很容易地实现通过简单地向他们传递另一种类型的访问者来处理)。

好吧,对于一个相当小的问题,这是一个相当冗长的描述,对于文字墙感到抱歉,但我很乐意提供任何类型的提示!

最佳答案

您需要在各种 Swing 绘制方法中完成所有绘制,这些绘制方法旨在为自定义绘制覆盖(例如 paintComponent)。只有 Swing 知道它何时完成绘制,或者何时需要绘制新的框架。

您真正需要做的是让您的 GraphicsPanel 引用保存形状状态的对象,然后在 中绘制表示该状态的图形paintComponent.

这也应该简化您的类关系图,因为在 GraphicsPanel 中,您可以从监听器调用状态对象的方法来更改状态(我会选择不同的名称以使状态对象不意识到更改基于 UI 交互,因此如果右键单击旋转,请将方法称为 rotate 而不是 handleRightClick)。

关于java - 在 Swing 中不同类的 JPanel 上绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40050070/

相关文章:

java - 用于 java 的 webm/vp8 播放器

java - UI 在 Debug模式下按预期更新,但在正常运行时不执行任何操作

java - 重命名文件失败

java - 为什么我的 JButton 即使在第一次单击时也没有在单击时在 JTextFrame 上显示输出?

java - 使用 swing 和鼠标监听器制作绘图应用程序

java - 如何强制 JContainer 重新布局自己?

java - 带有德语字母表的 Html 到 Pdf

java - Android Studio无法下载commons-compress-1.12.jar,我可以在浏览器上下载commons-compress-1.12.jar并粘贴到gradle上的位置吗?

java - 如何根据另一个 Java 注释定义一个 Java 注释?

Java 类未找到异常