Вопросы новичка по Scala Swing

Это мой первый эксперимент с использованием Swing со Scala, и у меня есть несколько вопросов о моем коде ниже. Все, что он делает, это создает окно с цветным прямоугольником, который меняет цвет. Пожалуйста, не стесняйтесь ответить на один или любой из вопросов.

Окно приложения

1) Ниже я использовал Java ActionListener, потому что не мог понять, как заставить javax.swing.Timer работать в качестве издателя. Есть ли способ использовать модель Scala, то есть listenTo(), или это способ сделать это?

2) Мое переопределенное значение preferredSize в панели не работает: окно свернуто. В моей версии Java я переопределяю метод getPreferredSize, но в Panel такого метода нет, поэтому я предположил, что это способ сделать это, но почему он не работает?

3) paintComponent вообще не задокументирован в документации Scala API. Я предполагаю, что это потому, что это protected доступ в Java, но это похоже на недосмотр. Правильно ли я переопределяю paintComponent или он скрыт, потому что вместо этого я должен использовать задокументированный метод paint?

4) Похоже, что в Scala нет методов getWidth() и getHeight() для компонентов - стандартно ли использовать size.width и size.height?

import swing._
import java.awt.{Graphics, Color}
import java.awt.event.{ActionEvent, ActionListener}
import javax.swing.Timer

object ColorPanel extends SimpleSwingApplication {
  private var c: Color = new Color(0)

  def top = new MainFrame {
    title = "Flash!"
    contents = p
  }

  val p = new Panel with ActionListener {
    override val preferredSize = new Dimension(200, 200)

    override def paintComponent(g: Graphics2D) {
      g.setColor(c)
      g.fillRect(0, 0, size.width, size.height)
    }

    def actionPerformed(e: ActionEvent) {
      c = new Color((c.getRGB() + 1000) % 16777216)
      repaint
    }
  }

  val timer = new Timer(100, p)
  timer.start()
}

person Luigi Plinge    schedule 23.07.2011    source источник


Ответы (1)


  1. Нет немедленного ответа. Но ваш подход, безусловно, в порядке. Я не понимаю, однако, почему ваш наблюдатель должен быть панелью. Я бы создал анонимный ActionListener непосредственно с таймером и вместо этого добавил бы в эту панель определенный метод, например def animateColor() { ... }
  2. Вы можете использовать preferredSize = new Dimension(200, 200)
  3. Согласно этому полуофициальному документу, да: http://www.scala-lang.org/sid/8 (раздел 6 Пользовательская окраска)
  4. Действительно, немного глупо постоянно создавать новый экземпляр Dimension. Но если вы посмотрите именно на пример SID, он делает то же самое, использует size.height. В сверхвысокопроизводительном коде вы можете захотеть напрямую обращаться к базовому узлу (peer.getWidth)
person 0__    schedule 23.07.2011