我在画布上绘制了一些多边形,并希望在绘制的多边形上绘制一些线条。如果我在绘制线条后绘制,绘制的多边形覆盖了线条,但如果我先画线,则线条会完全消失。代码在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)
}
}
}
答案 0 :(得分:2)
我可以马上告诉你,你的榜样不是自足的。例如,terrToCol
的{{1}}主体中的方法paint
未定义。我认为你了解Swing/Java2D painting的基础知识。
VisHexStd
句柄是一个有状态/可变的东西。因此,当更改嵌套绘画的顺序会产生意外结果时,这是由于这些绘制命令中的图形状态发生了变化。所有Graphics2D
或draw
命令都从图形句柄中获取颜色或绘画状态(fill
是Paint
的超级/更通用界面。
在主Color
方法中,您不设置颜色/颜色,依赖于默认值(组件的前景色)。但是在迭代中重复调用的paintComponent
paint
方法会改变paint属性(VisHex
),因此main方法中的setPaint
只使用任意的最后一个你设定的油漆。
尝试在gr2d.draw(line)
声明之前添加gr2d.setColor(getForeground)
。
答案 1 :(得分:0)
啊,这是我的愚蠢错误。我不知道draw甚至使用了setcolor方法。我只是假设它绘制了黑色线条,当然它默认情况下会这样做。我发现的多边形示例都使用了setcolor方法,但绘图示例没有。我为我的多边形使用了一种非常浅的颜色,这对于多边形显示得很好,但当用作一条线时几乎看不见。