Как я могу переопределить шрифт в java.awt.Component с Scala? - PullRequest
2 голосов
/ 15 июня 2011

Я пытался

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) }
                                                  ^

В чем причина этой ошибки и как ее следует делать правильно?

РЕДАКТИРОВАТЬ: Извините, не видел, что Скала также имеет Component. Component - это вопрос java.awt.Component!

1 Ответ

5 голосов
/ 15 июня 2011

Компонент содержит геттеры и сеттеры для font, поэтому канонический способ установить шрифт:

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)
}

Я не уверен, что это будет делать то, что вы хотите. (Edit: протестировано в сеансе REPL с загруженным слишком много мусора; вам на самом деле не нужно это делать! Простое переопределение var font = new java.awt.Font работает.) Обычный getter / setter предназначен для передачи информация о соединении с javax.swing. Если вы сделаете это таким образом, вы, вероятно, сломаете эту пересылку. Так что используйте первый метод.


Отредактируйте, если вы пытаетесь сделать это в java.awt.Component: Font font; - это личное поле в java.awt.Component. Вы не можете переопределить поля в Java, и вы не можете делать что-либо с закрытыми полями в Java. Поэтому попытка переопределить его с помощью новой переменной гарантированно не сработает. (Однако компилятор, безусловно, может выдать более информативное сообщение об ошибке!) Scala может переопределять только поля, потому что они на самом деле не поля - это пара получатель / установщик, ссылающаяся на скрытое базовое поле.

Вы должны использовать (или переопределить) getFont и setFont.

...