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

soc*_*soc 2 java fonts components overriding scala

我试过了

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

我得到了:

<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) }
                                         ^ 
Run Code Online (Sandbox Code Playgroud)

所以我试过了

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

但这根本没有帮助:

<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) }
                                                  ^
Run Code Online (Sandbox Code Playgroud)

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

编辑:对不起,没看到scala也有Component.该Component问题是由一个java.awt.Component!

Rex*_*err 5

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

class Foo extends Component {
  font = new java.awt.Font(/* blah blah */)
}
Run Code Online (Sandbox Code Playgroud)

如果要覆盖字体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)
}
Run Code Online (Sandbox Code Playgroud)

我不确定这会做你想要的.(编辑:在加载过多垃圾的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不是.