我试过了
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
!
最佳答案
组件包含字体
的getter和setter,因此设置字体的规范方法是:
class Foo extends Component {
font = new java.awt.Font(/* blah blah */)
}
如果你想覆盖字体定义以使用变量,你必须使用与 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 session 中进行了测试;您实际上不需要这样做!简单的覆盖 var font = new java.awt.Font 就可以了。)普通的 getter/setter 旨在传递传递给 javax.swing
对等点的信息。如果您这样做,您可能会破坏该转发。所以采用第一种方法。
如果您尝试在 java.awt.Component
中执行此操作,请进行编辑:Font font;
是 java.awt.Component< 中的私有(private)字段
。您无法覆盖 Java 中的字段,也无法对 Java 中的私有(private)字段执行任何操作。因此,尝试用新的变量覆盖它肯定是行不通的。 (但是,编译器当然可以给出信息更丰富的错误消息!)Scala 只能重写字段,因为它们不是真正的字段——它们是引用隐藏底层字段的 getter/setter 对。
您应该使用(或覆盖)getFont
和 setFont
来代替。
关于java - 如何使用 Scala 覆盖 java.awt.Component 中的字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362725/