2012-06-29 80 views
1

我在畫布上繪製了一些多邊形,並且想要在繪製的多邊形上繪製一些線條。如果在繪製線條後繪製,繪製的多邊形會覆蓋線條,但是如果我先繪製線條完全消失。代碼在Scala中,但我認爲所有相關代碼都來自Java庫。java:如何在畫布上繪製線條

編輯我已經擴大了在響應代碼雷克斯·科爾的評論

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) 
     } 
    } 
} 
+1

這不是工作代碼。我有成千上萬行代碼,首先繪製一個形狀,然後畫出一條線,然後就像你期望的那樣工作,所以你的代碼幾乎肯定會出錯。沒有一個工作的例子,我們不知道在哪裏。例如,您可以將顏色alpha設置爲零,或者您不能調用您認爲自己的繪畫方法,或者調用任何數量的其他東西。 –

+0

@RexKerr我已經做了一個更簡單的繪畫和繪製,行爲就像你描述的那樣。 –

回答

2

我可以告訴直線距離,你的例子不是獨立的。例如,在paint主體VisHexStd中的方法terrToCol沒有定義。我認爲你知道關於Swing/Java2D painting的基礎知識。

Graphics2D句柄是一個有狀態/可變的事情。所以當改變嵌套繪畫的順序時會產生意想不到的結果,這是由於這些繪畫命令中所做的圖形狀態的改變。所有drawfill命令從圖形句柄(是Color的超級/更一般的接口)獲取顏色或繪畫狀態。

在您的主要paintComponent方法中,您不會根據默認值(組件的前景色)設置顏色/顏色。但在迭代中重複調用的paint方法VisHex確實會更改paint屬性(setPaint),因此main方法中的gr2d.draw(line)只是使用您設置的任意最後一個繪製顏色。

嘗試在gr2d.draw(line)聲明前添加gr2d.setColor(getForeground)

+0

是的,我發現了我自己的答案中指出的問題,但是我已經爲您的努力給出了正確的答案,謝謝。 –

0

啊,這是我愚蠢的錯誤。我不知道,即使使用setcolor方法。我只是推測它畫了黑線,當然這是默認的。我發現的多邊形例子都使用了setcolor方法,但繪製的例子沒有。我爲我的多邊形使用了非常淺的顏色,對於多邊形顯示出很好,但在用作線條時實際上看不到它。