Scala mengayunkan pertanyaan pemula

Ini adalah percobaan pertama saya menggunakan Swing dengan Scala, dan ada beberapa pertanyaan tentang kode saya di bawah ini. Yang dilakukannya hanyalah menghasilkan jendela dengan persegi panjang berwarna yang berubah warna. Silakan menjawab salah satu atau salah satu pertanyaan.

Jendela aplikasi

1) Saya menggunakan Java ActionListener di bawah ini karena saya tidak tahu cara membuat javax.swing.Timer berfungsi sebagai Publisher. Apakah ada cara untuk menggunakan model Scala, yaitu listenTo() - atau ini cara melakukannya?

2) Nilai preferredSize saya yang diganti di Panel sepertinya tidak berfungsi: jendela muncul diminimalkan. Di versi Java saya mengganti metode getPreferredSize, tetapi tidak ada metode seperti itu di Panel, jadi saya berasumsi ini adalah cara untuk melakukannya, tetapi mengapa tidak berhasil?

3) paintComponent tidak didokumentasikan sama sekali dalam dokumentasi Scala API. Saya berasumsi ini karena aksesnya protected di Java, tetapi sepertinya ini adalah kekeliruan. Apakah saya benar untuk mengganti paintComponent atau disembunyikan karena saya seharusnya menggunakan metode paint yang terdokumentasi?

4) Scala sepertinya tidak memiliki metode getWidth() dan getHeight() pada komponen - apakah standar menggunakan size.width dan 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 sumber


Jawaban (1)


  1. Tidak ada jawaban langsung. Tapi pendekatan Anda tentu saja baik-baik saja. Saya tidak mengerti mengapa pengamat Anda harus menjadi panel. Saya akan membuat ActionListener anonim langsung dengan pengatur waktu, dan sebagai gantinya menambahkan metode khusus ke panel itu, seperti def animateColor() { ... }
  2. Anda dapat menggunakan preferredSize = new Dimension(200, 200)
  3. Menurut dokumen kuasi resmi ini, ya: http://www.scala-lang.org/sid/8 (bagian 6 Lukisan Kustom)
  4. Memang agak bodoh untuk membuat instance Dimension baru setiap saat. Tetapi jika Anda melihat persis contoh SID, fungsinya sama, menggunakan size.height. Dalam kode kinerja super tinggi, Anda mungkin ingin memanggil langsung ke rekan yang mendasarinya (peer.getWidth)
person 0__    schedule 23.07.2011