尝试覆盖scala中的getListCellRenderComponent方法时,对象创建不可能出错

时间:2014-01-21 00:50:01

标签: java swing scala override

我正在尝试覆盖scala类中的DefaultListCellRenderer类中的getListCellRendererComponent方法(我正在使用intellij scala插件)​​。这是下面的代码:

val cellRenderer = new javax.swing.DefaultListCellRenderer {
  override def getListCellRendererComponent(list: JList[_], value: AnyRef, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {
    val retval: JLabel = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus).asInstanceOf[JLabel]
    retval.setForeground(getVariableColor(value.toString))
    return retval.asInstanceOf[JLabel]
  }
}

varsCombo.setRenderer(cellRenderer)

我得到这个错误: 因为trait中的方法getListCellRendererComponent

,所以不可能创建对象
  

ListCellRenderer类型为(x $ 1:javax.swing.JList [_<:Object],x $ 2:   Object,x $ 3:Int,x $ 4:Boolean,x $ 5:Boolean)java.awt.Component不是   定义       val cellRenderer = new javax.swing.DefaultListCellRenderer {

我很困惑为什么......我刚刚开始学习scala语言,并且没有想到为什么这不起作用的原因。

感谢任何帮助,谢谢!

修改

我找到了一个人似乎有同样问题的页面: http://www.scala-lang.org/old/node/10687

“最后我通过简单的解决方法解决了这个问题。这是 扩展DefaultListCellRenderer的解决方案(任务是我的 域类):

object TaskCellRenderer extends ListCellRenderer[Task] {

 val peerRenderer: ListCellRenderer[Task] = (new
 DefaultListCellRenderer).asInstanceOf[ListCellRenderer[Task]]

 override def getListCellRendererComponent (
 list: JList[_ <: Task], task: Task, index: Int,
 isSelected: Boolean, cellHasFocus: Boolean): Component = {

val component = peerRenderer.getListCellRendererComponent(
 list, task, index, isSelected, cellHasFocus)
 .asInstanceOf[JComponent]

 // ... do some component customization here ...

component
}
}

而不是直接扩展DefaultListCellRenderer我实现 ListCellRenderer接口。 “


问题是我不知道为什么这会解决这个问题?以及如何将解决方案应用于我的问题......因为我们试图实现稍微不同的事情。

如果有人能解释为什么解决方案有效,或者如何将其应用到我的问题中......将不胜感激! (对不起,请记住我对scala很新)

1 个答案:

答案 0 :(得分:0)

您正在重写Java通用方法:

public Component getListCellRendererComponent(
        JList<?> list,
        Object value,
        int index,
        boolean isSelected,
        boolean cellHasFocus)

这样做有限制。有关详细信息,请参阅此处:Scala: Overriding Generic Java Methods II