如何用Scala覆盖java.awt.Component中的字体?

时间:2011-06-15 18:48:32

标签: java scala fonts components override

我试过

scala> class Foo extends Component { var font = new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12) }

我得到了:

<console>:10: error: overriding variable font in class Component of type java.awt.Font;
 variable font needs `override' modifier
       class Foo extends Component { var font = new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12) }
                                         ^ 

所以我试过

scala> class Foo extends Component { override var font = java.awt.new Font("Helvetica", java.awt.Font.BOLD, 12) }

但这根本没有帮助:

<console>:10: error: overriding variable font in class Component of type java.awt.Font;
 variable font has incompatible type
       class Foo extends Component { override var font = new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12) }
                                                  ^

这个错误背后的原因是什么,应该如何正确完成?

编辑:抱歉,没看到scala也有Component。有问题的Component来自java.awt.Component

1 个答案:

答案 0 :(得分:5)

组件包含font的getter和setter,因此设置字体的规范方法是:

class Foo extends Component {
  font = new java.awt.Font(/* blah blah */)
}

如果要覆盖字体defs以使用var,,则必须使用与scala.swing.Font兼容的内容,它包装Java字体(通常使用隐式转换完成)​​。像这样:

class Foo extends Component {
  override var font: scala.swing.Font =
    new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12)
}

我不确定这会做你想要的。 (编辑:在加载了太多垃圾的REPL会话中测试;你实际上不需要这样做!简单的覆盖var font = new java.awt.Font是有效的。)正常的getter / setter旨在通过有关通过javax.swing同行的信息。如果你这样做,你可能会打破转发。所以使用第一种方法。


如果您尝试在java.awt.Component中执行此操作,请进行修改:Font font;java.awt.Component中的私有字段。您不能覆盖Java中的字段,也不能使用Java中的私有字段执行任何。因此,尝试使用新的var覆盖它将保证不起作用。 (然而,编译器当然可以提供更具信息性的错误消息!)Scala只能覆盖字段,因为它们不是真正的字段 - 它们是引用隐藏的底层字段的getter / setter对。

您应该使用(或覆盖)getFontsetFont代替。