gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:37:40 25 4
gpt4 key购买 nike

我目前正在为我的学士论文研究一个测试驱动的交互式 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com