java:如何绘制画布上方的线条

时间:2012-06-29 15:51:41

标签: swing scala java-2d

我在画布上绘制了一些多边形,并希望在绘制的多边形上绘制一些线条。如果我在绘制线条后绘制,绘制的多边形覆盖了线条,但如果我先画线,则线条会完全消失。代码在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)
      }
   }
}

2 个答案:

答案 0 :(得分:2)

我可以马上告诉你,你的榜样不是自足的。例如,terrToCol的{​​{1}}主体中的方法paint未定义。我认为你了解Swing/Java2D painting的基础知识。

VisHexStd句柄是一个有状态/可变的东西。因此,当更改嵌套绘画的顺序会产生意外结果时,这是由于这些绘制命令中的图形状态发生了变化。所有Graphics2Ddraw命令都从图形句柄中获取颜色或绘画状态(fillPaint的超级/更通用界面。

在主Color方法中,您不设置颜色/颜色,依赖于默认值(组件的前景色)。但是在迭代中重复调用的paintComponent paint方法会改变paint属性(VisHex),因此main方法中的setPaint只使用任意的最后一个你设定的油漆。

尝试在gr2d.draw(line)声明之前添加gr2d.setColor(getForeground)

答案 1 :(得分:0)

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