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ステートフル/ミュータブルです。したがって、ネストされたペイントの順序を変更すると予期しない結果が生じる場合、それはそれらのペイント コマンドで行われたグラフィックス状態の変更によるものです。すべてのdraworfillコマンドは、グラフィックス ハンドル (Paintの超/より一般的なインターフェイスColor) から色またはペイントの状態を取得します。

メインpaintComponentメソッドでは、デフォルト (コンポーネントの前景色) に依存して、色/ペイントを設定しません。ただし、反復で繰り返し呼び出すpaintメソッドは、ペイント プロパティ ( ) を変更するため、メイン メソッドでは、最後に設定した任意のペイントを使用するだけです。VisHexsetPaintgr2d.draw(line)

ステートメントgr2d.setColor(getForeground)の前に追加してみてください。gr2d.draw(line)

于 2012-06-29T16:37:03.197 に答える
0

ああ、それは私のばかげた間違いでした。draw が setcolor メソッドを使用していることさえ知りませんでした。黒い線を描いたと思いましたが、もちろんデフォルトでそうなっています。私が見つけたポリゴンの例はすべて setcolor メソッドを使用していましたが、draw の例は使用していませんでした。ポリゴンには非常に明るい色を使用していましたが、ポリゴンには問題なく表示されましたが、線として使用するとほとんど見えませんでした。

于 2012-06-29T16:37:47.347 に答える