在scala swing中重写textarea的绘制方法

在scala swing中重写textarea的绘制方法,swing,scala,overriding,paint,Swing,Scala,Overriding,Paint,我目前正在学习scala.swing,我很好奇是否可以覆盖现有组件(如textarea)的绘制方法,结果是可以,但我再次认为我做错了什么: var rectangles = List[Rectangles]() val textarea = new TextArea(){ override def paint(g:Graphics2D){ super.paint(g) rectangles.foreach{g.draw} } } 这个片段显示我

我目前正在学习scala.swing,我很好奇是否可以覆盖现有组件(如textarea)的绘制方法,结果是可以,但我再次认为我做错了什么:

var rectangles = List[Rectangles]()

val textarea = new TextArea(){
    override def paint(g:Graphics2D){
        super.paint(g)
        rectangles.foreach{g.draw}
    }
}
这个片段显示我有一个矩形列表和一个文本区域。这是没有道理的。我只是好奇我是否能在文本区域上画出矩形

当调试/添加打印时,它清楚地显示它通过我的重写绘制方法运行,但它不会显示我的矩形

我只是使用Graphics2D对象有误,或者为什么我看不到我的矩形


谢谢您提前提供的任何帮助

好吧,原来我不能像这样使用foreach,这就是它的工作原理

rectangles.foreach{r => g.draw(r)}
这回答了实际问题,但它让我感到困惑,因为我习惯于这样使用foreach

foo.foreach{println}

但我想这是另一个问题,您的代码工作正常

import scala.swing._

object Test extends SimpleSwingApplication {
  var rectangles = List[Rectangle]()

  val textarea = new TextArea(){
    override def paint(g:Graphics2D){
      super.paint(g)
      rectangles.foreach{g.draw}
    }
  }

  lazy val top = new Frame {
    rectangles ::= new Rectangle(8, 8, 20, 20) // example
    contents = textarea
    size = new Dimension(100, 100)
  }
}

Test.main(null)

你完全可以用前面提到的方式使用foreach。请添加更多信息。(矩形列表是空的吗?例如)矩形不是空的->它是否工作似乎只取决于我使用foreach的方式