2010-06-28 18 views
6

Biraz Scala gui programlaması deniyorum (scala'daki ilk projem, bu yüzden basit bir şeyle başlayacağımı düşündüm). Ama göreceli olarak önemsiz gibi görünen bir şeye yapışmış gibiyim. Scala.swing.MainFrame'i genişleten bir sınıfım var ve bir kullanıcı bir pencereye odaklandığında bir tuşa bastığında bunu belirlemek istiyorum. Komik olan şu ki, bu olayı ateşlemenin bir yolunu bulmak mümkün görünmüyor.Scala'daki önemli olaylara yanıt verme

Başka birinin sorunun etrafına nasıl bulaştığına dair bir örnek buldum: http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala ama Java Swing API'sini kullanmaya başlamış görünüyorlar, ki bu biraz hayal kırıklığı yaratıyor. Olayları yakalamanın daha aptalca bir yolu olup olmadığını bilen var mı?

cevap

0

Benim çözüm aşağıdaki yapmamı gerektiriyordu.

1

this.keys dinlemenizi bekliyorum (burada this klavye olaylarını alan GUI öğesidir). mouse event ile ilgili eşdeğer soruya bakın. Orada bu bileşene bağlı herhangi bir düğme nesneleri vardı veya onun herhangi bir çocuk ise

class MyFrame extends MainFrame { 

this.peer.addKeyListener(new KeyListener() { 
    def keyPressed(e:KeyEvent) { 
     println("key pressed") 
    } 

    def keyReleased(e:KeyEvent) { 
     println("key released") 
    } 

def keyTyped(e:KeyEvent) { 
     println("key typed") 
    } 
}) 

} 

Bu yalnızca olsa çalışmak gibiydi: Bunun

+0

Thx Daniel ile çalışmak gibi görünüyor, ben de bu gerekli. Scala'nın salıncak belgeleri gerçekten zayıf. – Aymen

+0

'this.keys'' scala.swing.MainFrame' öğesinin geçerli bir özelliği gibi görünmüyor. Ne de bu "Beyler", "Bu.Keyboard" veya "this.keyboard". Bu konuda herhangi bir belge var mı? – Ceilingfish

+0

@Ceilingfish "MainFrame" değil, "Bileşen": etiketler, paneller, metin alanları vb. Ve elbette, "bu", bileşenin kendisini ifade eder. –

3

this.keys dinlemeye ek olarak, bileşen üzerinde requestFocus öğesini çağırmalı veya Panel veya türetilmiş sınıf ise focusable = true değerini belirlemelisiniz.

0

Tüm olayları java olaylarına geri dönmek yerine, bu olayları yayınlayan keys vardır (bu nedenle MainFrame yapmaz). En iyi çözümün ne olduğundan emin değilsiniz, ancak her zaman çerçevedeki her şeyi Component içine sarmak ve keys numarasını dinlemek mümkündür.

6

Bu Scala 2,9

package fi.harjum.swing 

import scala.swing._ 
import scala.swing.event._ 
import java.awt.event._ 

object KeyEventTest extends SimpleSwingApplication { 
    def top = new MainFrame { 
     val label = new Label { 
      text = "No click yet" 
     } 
     contents = new BoxPanel(Orientation.Vertical) { 
      contents += label 
      border = Swing.EmptyBorder(30,30,10,10) 
      listenTo(keys) 
      reactions += { 
       case KeyPressed(_, Key.Space, _, _) => 
        label.text = "Space is down" 
       case KeyReleased(_, Key.Space, _, _) => 
        label.text = "Space is up" 
      } 
      focusable = true 
      requestFocus 
     } 
    } 
}