2012-06-29 3 views
1

Я рисую несколько полигонов на холсте и хочу нарисовать несколько линий над окрашенными полигонами. Если я рисую после рисования линии, окрашенные полигоны покрывают линию, но если я рисую сначала, линия полностью исчезает. Код находится в Scala, но я думаю, что все соответствующие коды из Java-библиотек.java: как рисовать линии над картиной холста

Редактировать Я расширил код в ответ на комментарий Rex Керра

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

Это не рабочий код. У меня есть тысячи строк кода, в которых я сначала рисую фигуру, а затем рисую над ней линию, и это работает так, как вы ожидали, поэтому в вашем коде почти что-то не так. Без рабочего примера мы не можем сказать, где. Например, вы можете настроить цветной альфа на ноль, иначе вы не могли бы назвать метод рисования, который, по вашему мнению, вы или любое другое. –

+0

@RexKerr Я сделал более простую краску и рисую, и поведение, как вы описали. –

ответ

2

я могу сказать сразу, что ваш пример не является самодостаточным. Например, метод terrToCol в корпусе paintVisHexStd не определен. Я понимаю, что вы знаете основы о Swing/Java2D painting.

Рукоятка Graphics2D - это состояние, изменяющее состояние. Таким образом, при изменении порядка вложенной живописи возникают неожиданные результаты, это связано с изменением состояния графики, выполненного в этих командах рисования. Все команды draw или fill принимают цвет или состояние краски из графического дескриптора (Paint - это супер/более общий интерфейс Color).

В вашем основном методе paintComponent вы не устанавливаете цвет/краску, полагаясь на значение по умолчанию (цвет переднего плана компонента). Но метод paintVisHex, который вы вызываете повторно в итерации, меняет свойство краски (setPaint), поэтому gr2d.draw(line) в основном методе просто использует любую произвольную последнюю краску, которую вы установили.

Попробуйте добавить gr2d.setColor(getForeground) перед сообщением gr2d.draw(line).

+0

Да, я нашел проблему, как указано в моем собственном ответе, но я дал вам правильный ответ за ваши усилия, спасибо. –

0

А это была моя глупая ошибка. Я не знал, что рисовать даже использовал метод setcolor. Я просто предположил, что он нарисовал черные линии, что, конечно, по умолчанию. В примерах многоугольника, которые я нашел, все использовали метод setcolor, но примеры рисования этого не сделали. Я использовал очень светлый цвет для своих полигонов, которые отлично проявились для полигонов, но были практически невидимы при использовании в качестве линии.

Смежные вопросы