1

我在画布上画了一些多边形,并想在画的多边形上画一些线。如果我在画线后画线,画的多边形会覆盖线,但如果我先画线,线会完全消失。代码在 Scala 中,但我认为所有相关代码都来自 Java 库。

编辑我已经扩展了代码以响应 Rex Kerr 的评论

package rStrat
package rSw
package mapCanv
import swing._
import java.awt.geom._
import java.awt.Polygon

abstract class MapCanv [T <: TypesD](val mArea: GeomBase[T]#MapArea) extends Panel
{
   type VHexT <: VisHex  
   val vHexs: Vec[VisHex] = mArea.mHexs.map(i => newVHexT(i))
   def newVHexT(mHex: GeomBase[T]#MapArea#MapHex): VHexT
   val line: Line2D.Double = new Line2D.Double(0,0, 350, 350)

   override def paintComponent (gr2d: Graphics2D)
   {
      super.paintComponent (gr2d)    
      vHexs.foreach(i => i.paint(gr2d))
      gr2d.draw(line)
   }  

    abstract class VisHex (val mHex: GeomBase[T]#MapArea#MapHex) extends Polygon with PaintTr
   {
      mHex.verts.foreach(i => addPoint(i.x.toInt, i.y.toInt))     
   }

   trait PaintTr
   {
      def paint(gr2d: Graphics2D): Unit
   }  
}

package rStrat //separate file
package rSw
package mapCanv
import swing._
//import java.awt._

abstract class MapCanvStd[T <: TypesStd](mArea: GeomBase[T]#MapArea) extends MapCanv[T](mArea)
{
   type VHexT = VisHexStd   
   override def newVHexT(mHex: GeomBase[T]#MapArea#MapHex) = new VisHexStd(mHex)

   class VisHexStd(mHex: GeomBase[T]#MapArea#MapHex) extends VisHex(mHex)
   {
      override def paint(gr2d: Graphics2D): Unit = 
      {          
         gr2d.setPaint(terrToCol(mHex.hex.terr))
         gr2d.fill(this)
      }
   }
}
4

2 回答 2

2

我可以立即告诉您,您的示例不是独立的。例如terrToColpaint主体中的VisHexStd方法没有定义。我认为您了解Swing/Java2D 绘画的基础知识。

Graphics2D句柄是一个有状态/可变的东西。因此,当更改嵌套绘制的顺序产生意外结果时,这是由于在这些绘制命令中对图形状态所做的更改。所有drawfill命令从图形句柄(Paint是一个超级/更通用的接口Color)中获取颜色或绘制状态。

在您的主要paintComponent方法中,您不设置颜色/油漆,而是依赖默认值(组件的前景色)。但是您在迭代中重复调用的方法确实会更改绘制属性 ( paint) ,因此在 main 方法中只使用您设置的任意最后一次绘制。VisHexsetPaintgr2d.draw(line)

尝试在语句gr2d.setColor(getForeground)之前添加。gr2d.draw(line)

于 2012-06-29T16:37:03.197 回答
0

啊,这是我的愚蠢错误。我不知道 draw 甚至使用了 setcolor 方法。我只是假设它画了黑线,这当然是默认的。我发现的多边形示例都使用了 setcolor 方法,但绘制示例没有。我为我的多边形使用了一种非常浅的颜色,这对于多边形来说很好,但在用作一条线时几乎是不可见的。

于 2012-06-29T16:37:47.347 回答