Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Swing中的另一个班级的JPanel上绘画_Java_Swing - Fatal编程技术网

Java 在Swing中的另一个班级的JPanel上绘画

Java 在Swing中的另一个班级的JPanel上绘画,java,swing,Java,Swing,我目前正在为我的学士学位论文进行测试驱动的交互式2D流体动力学模拟。其基本思想是用户可以在屏幕上绘制形状,程序将模拟流体如何围绕这些形状流动。 到目前为止,我只开始了绘画过程,我已经遇到了一个小问题 如您所见,我创建了一个Painter类,它可以访问多个形状,并根据形状类型调用一个抽象绘制方法。然后是SwingPaint类,它继承自Painter类,实现了三种绘制方法以及clear方法。 以下是我的SwingPaint的代码: public class SwingPainter extends

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

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

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());
    }
}
公共类SwingPaint扩展了{
私人最终图形面板图形面板;
公共SwingPaint(图形面板图形面板){
this.graphicPanel=graphicPanel;
}
私有图形getGraphics(){
返回graphicPanel.getGraphics();
}
@凌驾
受保护的空心漆线(点起点、点终点){
getGraphics().drawine(start.getX(),start.getY(),end.getX(),end.getY());
}
@凌驾
受保护的空心矩形(点起点、点终点){
int minX=start.getX()
因此,我的问题是GraphicPanelPresenter(参见UML图)负责在用户左键单击或移动鼠标时将绘制者/访问者传递给形状(例如,线条的第二个点将跟随光标)。这意味着实际的绘制是在Swing的绘制方法之外完成的。因此,我在画画时遇到了一些闪烁现象,我想知道是否有人知道如何在不将整个画师/访问者功能抛出窗口的情况下修复这些问题(因为还有其他与形状相关的功能,这些功能仍然需要实现,只需将另一种类型的访问者传递给它们即可轻松处理)


嗯,对于一个相当小的问题来说,这是一个相当长的描述,很抱歉出现了文字墙,但我很高兴得到任何提示

您需要在各种Swing paint方法中执行所有的绘制操作,这些方法设计用于覆盖自定义绘制(例如
paintComponent
)。只有Swing知道何时完成绘制,或者何时需要绘制新的框架

看起来你真正需要做的是让你的
GraphicsPanel
有一个对保存形状状态的对象的引用,然后在
paintComponent
中绘制表示该状态的图形


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

我想把需要的组件公开/添加吸气剂,然后访问所有的绘画,都应该在Prand方法中完成。考虑传递油漆方法的所有者(即容器)。所需信息。您走错了方向。所有绘制和组件图形对象的所有使用都应该在JComponent的paintComponent方法中完成。这样,如果组件的大小调整/reshown/etc,则可以重新绘制。您可能需要使用(缓冲)在paintComponent方法中创建图像,并从其他类中绘制图像。但请确保在UI线程上完成对该图像执行的所有图形操作,以便在屏幕上重新绘制图像时,该图像始终处于一致状态