2010-06-28 41 views
6

Tôi đang thử nghiệm một chút về lập trình Scala gui (dự án đầu tiên của tôi trong scala, vì vậy tôi nghĩ tôi sẽ bắt đầu với một cái gì đó đơn giản). Nhưng tôi dường như đã bị mắc kẹt ở một cái gì đó mà có vẻ như nó nên được tương đối tầm thường. Tôi có một lớp mở rộng scala.swing.MainFrame và tôi muốn phát hiện khi người dùng nhấn một phím khi cửa sổ đó có tiêu điểm. Điều thú vị là tôi dường như không thể tìm thấy bất kỳ cách nào để có được sự kiện đó để bắn.Trả lời các sự kiện quan trọng trong scala

Tôi đã tìm thấy ví dụ về cách người khác gặp vấn đề ở đây: http://houseofmirrors.googlecode.com/svn/trunk/src/src/main/scala/HouseGui.scala nhưng dường như họ đã hoàn nguyên về sử dụng API Swing của Java, điều này hơi đáng thất vọng. Có ai biết nếu có một cách thành công hơn trong việc chặn các sự kiện?

Trả lời

0

Giải pháp của tôi cho điều này đòi hỏi tôi phải làm như sau:

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") 
    } 
}) 

} 

này dường như chỉ để làm việc mặc dù nếu có không có đối tượng nút gắn liền với thành phần này, hoặc bất kỳ đó là trẻ em.

1

Tôi hy vọng bạn cần nghe this.keys (trong đó this là phần tử của GUI nhận sự kiện bàn phím). Xem câu hỏi tương đương về mouse event.

+0

Thx Daniel, tôi cần này quá. Tài liệu swing của scala thật sự rất nghèo nàn. – Aymen

+0

'this.keys' này dường như không phải là thuộc tính hợp lệ của' scala.swing.MainFrame'. Cũng không phải 'this.Keys',' this.Keyboard' hoặc 'this.keyboard' này. Có tài liệu nào về điều này ở đâu không? – Ceilingfish

+0

@Ceilingfish Không phải là 'MainFrame', nhưng là' Component': nhãn, bảng, vùng văn bản, v.v. Và, tất nhiên, 'this' đề cập đến chính thành phần đó. –

3

Ngoài việc nghe this.keys bạn cũng nên gọi requestFocus trên thành phần hoặc đặt focusable = true, nếu đó là Bảng điều khiển hoặc lớp dẫn xuất.

0

Thay vì quay trở lại các sự kiện java, tất cả các thành phần có keys xuất bản các sự kiện này (vì vậy MainFrame không). Không chắc chắn giải pháp tốt nhất là gì nhưng bạn luôn có thể bọc mọi thứ trong khung bên trong Component và nghe số keys của nó.

6

Điều này dường như làm việc với 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 
     } 
    } 
}  
Các vấn đề liên quan