【问题标题】:Object creation impossible error when trying to override getListCellRenderComponent method in scala尝试覆盖 scala 中的 getListCellRenderComponent 方法时无法创建对象错误
【发布时间】: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


    【解决方案1】:

    您正在重写 Java 泛型方法:

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

    这样做是有限制的。详情请参阅:Scala: Overriding Generic Java Methods II

    【讨论】:

    • 谢谢,但是我不完全理解解决方案..因为我仍然不熟悉 scala 语言。例如代码中的 this: this: ConcreteJava => 是什么意思?
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2011-02-24
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多