คำถามมือใหม่สกาล่าสวิง

นี่เป็นการทดลองครั้งแรกของฉันโดยใช้ 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