【发布时间】:2014-01-21 00:50:01
【问题描述】:
我正在尝试覆盖 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 int boolean 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 很陌生)
【问题讨论】:
标签: java swing scala overriding