【问题标题】:drawing simple shapes -> paint method and interface for JavaFX绘制简单形状 -> JavaFX 的绘制方法和接口
【发布时间】:2017-02-03 22:35:41
【问题描述】:

我正在为学校做作业,但我无法理解解决此问题所需的逻辑。我希望你们中的一些人能指出我正确的方向。
我有一些类可以绘制简单的形状:

类图1

扩展类图

根据分配,DrawingItem 下的每个延迟类都需要一个paint() 方法才能绘制独立于GraphicsContext 的特定(OvalSpline 等)。对于Oval,我猜这个方法应该是这样的:

public void paint(Graphics g){
     g.setColor(super.getColor());
     g.drawOval(
        (int) dw.getAnchor().getX(), (int) dw.getAnchor().getY(), 
        (int)this.width, (int)this.height
     );`
}

扩展类图显示了一个接口IPaintable,我为每个形状创建了一个方法。 JavaFX 端 (DrawingTool) 实现了这个接口及其所有方法。这些方法需要形状对象作为参数。我使用这些方法在 javaFX 中绘制形状,还是椭圆示例:

strokeOval(
    oval.getHeight(), oval.getWidth(), oval.getAnchor().getX(), oval.getAnchor().getY()
);

我的主要问题是:

  1. 形状子类中的 paint() 方法是否朝着正确的方向前进?如果是,我如何从 JavaFX 端调用它们?
  2. 如何在DrawingDrawingItem 类中“实现”paint(paintable:IPaintable) 方法?

【问题讨论】:

    标签: java javafx interface


    【解决方案1】:

    在类图中很容易识别 2 种设计模式:

    IPaintable 应该是 GUI 绘图操作的包装器(外观),允许您使用 类图 1 中的类,独立于所使用的 GUI 库。您应该只在paint 方法中使用IPaintable 提供的方法。

    类图1中的类是Command Pattern命令部分; DrawingToolinvoker/clientIPaintablereceiver


    DrawingTool 类应包含如下代码:

    IPaintable paintable = new JavaFXPaintable(canvas.getGraphicsContext());
    

    如果需要重绘,就这样使用:

    drawing.paint(paintable);
    

    实现paint 方法

    由于可以使用IPaintable 的方法绘制Oval,它应该像这样实现paint

    public void paint(IPaintable paintable) {
        paintable.setColor(color);
        paintable.paintOval(this);
    }
    

    Polygon 将使用 IPaintablepaintLine 方法传递给它的 paint 方法来绘制自身,Drawing.paint 将清除 IPaintable 并绘制它的所有 items 等。

    JavaFxPaintable 中,paintOval 方法将这样实现:

    public void paintOval(Oval oval) {
        Point anchor = oval.getAnchor();
        graphics.strokeOval(anchor.getX(), anchor.getY(), oval.getWidth(), oval.getHeight());
    }
    

    如果anchor 表示左上角而不是中心,您可能需要稍微修改一下。

    【讨论】:

      【解决方案2】:

      感谢 fabian,向我指出这个方向确实很有帮助(因为清理我的帖子以提高可读性也是如此)。 现在我已经实现了这些指针,它们似乎工作了。使用 Drawingtool 中的 draw() 方法,我在 Drawing 类中调用 paint(IPaintable paintable) 方法,该方法循环遍历此类中的绘图项列表,如下所示:

      public void paint(IPaintable paintable){
              for (DrawingItem test : drawingitems){
                  if (test instanceof Oval){
                      paintable.paintOval((Oval) paintable);
                      }  else if (test instanceof Image){
                          paintable.paintImage((Image) paintable);
      

      这应该绘制形状并且似乎可以工作。最后一部分是将它们添加到在 DrawingTool 类中初始化的画布中。我似乎无法弄清楚如何做到这一点。我尝试在使用绘图项目浏览列表时添加它们,但这似乎不起作用(或者我处理错了)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        相关资源
        最近更新 更多