Scala Swing вопросы новичка - PullRequest
2 голосов
/ 23 июля 2011

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

App window

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

2) Мое переопределенное значение preferredSize в Panel не работает: окноподходит к минимуму.В моей версии 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()
}

1 Ответ

3 голосов
/ 24 июля 2011
  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)
...