Swing java:如何在画布上画线
我正在画布上画一些多边形,想在画的多边形上画一些线。如果在绘制线后绘制,绘制的多边形将覆盖该线,但如果首先绘制,该线将完全消失。代码在Scala中,但我认为所有相关代码都来自Java库 编辑我根据Rex Kerr的评论扩展了代码Swing java:如何在画布上画线,swing,scala,java-2d,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 <
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)
}
}
}
package-rStrat
包rSw
包mapCanv
导入swing_
导入java.awt.geom_
导入java.awt.Polygon
抽象类MapCanv[ti.paint(gr2d))
gr2d.绘制(直线)
}
抽象类VisHex(val-mHex:GeomBase[T]#MapArea#MapHex)使用paintr扩展多边形
{
mHex.verts.foreach(i=>addPoint(i.x.toInt,i.y.toInt))
}
特性油漆
{
def油漆(gr2d:Graphics2D):单位
}
}
包rStrat//单独文件
包rSw
包mapCanv
导入swing_
//导入java.awt_
抽象类MapCanvStd[T我可以马上看出您的示例不是独立的。例如,VisHexStd
的paint
主体中的terrToCol
方法没有定义。我认为您了解有关的基本知识
Graphics2D
句柄是有状态/可变的。因此,当更改嵌套绘制的顺序产生意外结果时,这是由于在这些绘制命令中更改了图形状态。所有draw
或fill
命令都从图形句柄获取颜色或绘制状态(Paint
是Color
的超级/更通用界面)
在主paintComponent
方法中,您不根据默认值(组件的前景色)设置颜色/绘制。但是您在迭代中反复调用的VisHex
的paint
方法会更改绘制属性(setPaint
),因此gr2d.draw(线)
在main方法中,只使用您设置的任意最后一次绘制
尝试在gr2d.draw(线)之前添加gr2d.setColor(getForeground)
语句。啊,这是我愚蠢的错误。我不知道draw甚至使用了setcolor方法。我只是假设它绘制了黑色线条,这当然是默认情况。我找到的多边形示例都使用了setcolor方法,但draw示例没有。我对多边形使用了非常浅的颜色,显示为精细f或者多边形,但当用作直线时实际上是看不见的。这不是有效的代码。我有数千行代码,我先画一个形状,然后在上面画一条线,这就像你预期的那样,所以几乎可以肯定你的代码中有错误。没有有效的示例,我们无法知道在哪里。例如,你你可以将你的颜色alpha设置为零,或者你不能调用你认为你是的绘制方法,或者其他任何东西。@RexKerr我做了一个更简单的绘制和绘制,其行为正如你所描述的。是的,我发现了我自己的答案中指出的问题,但我已经为你的努力给出了正确的答案,谢谢。