【问题标题】:How can I override the font in java.awt.Component with Scala?如何使用 Scala 覆盖 java.awt.Component 中的字体?
【发布时间】:2011-09-15 19:18:25
【问题描述】:

我试过了

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

【问题讨论】:

    标签: java scala fonts components overriding


    【解决方案1】:

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

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

    如果你想覆盖字体定义以使用 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

    【讨论】:

    • +1 有时这些隐式转换确实会导致奇怪的错误消息......
    • @x3ro - 确实。但有时你认为一件事应该以一种方式工作,但它实际上以不同的方式工作,然后你也会收到看起来很奇怪的错误消息,直到你意识到它不像你想象的那样工作。我认为,这属于后一种情况——“可变字体具有不兼容的类型”对我来说似乎非常清楚。它的意思是,“你认为它是 java.awt.Font,但它不是。”
    • 好吧,我得到了类似“在 java.awt.Font 类型的类组件中覆盖变量字体;方法字体具有不兼容的类型”,即使我指定了 font:java.awt.Font 。这对我来说很不清楚。或者也许我在这里没有明白你的意思^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2011-08-24
    • 1970-01-01
    • 2012-06-18
    • 2012-04-06
    相关资源
    最近更新 更多