Swing java:如何在画布上画线

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 <

我正在画布上画一些多边形,想在画的多边形上画一些线。如果在绘制线后绘制,绘制的多边形将覆盖该线,但如果首先绘制,该线将完全消失。代码在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)
      }
   }
}
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我做了一个更简单的绘制和绘制,其行为正如你所描述的。是的,我发现了我自己的答案中指出的问题,但我已经为你的努力给出了正确的答案,谢谢。