Написание собственного ключевого издателя для MainFrame - PullRequest
0 голосов
/ 03 апреля 2011

Я хочу, чтобы мой MainFrame перехватывал ключевые события. Я не нашел ни одного ключевого издателя в нем, поэтому я напишу свой собственный ... У меня есть что-то вроде этого:

class ImageView(image: ImageIcon, parent: UIElement = null) extends MainFrame {

  object keys extends Publisher {
    peer.addKeyListener(new KeyListener {
      def keyPressed(e: java.awt.event.KeyEvent) {
        publish(new KeyPressed(e))
      }

      def keyReleased(e: java.awt.event.KeyEvent) {
        publish(new KeyReleased(e))
      }

      def keyTyped(e: java.awt.event.KeyEvent) {
        publish(new KeyTyped(e))
      }
    })
  }

  listenTo(keys)

  reactions += {
     case KeyPressed(_, key,_,_) =>
       if (key == Key.Escape) dispose
  }

}

В любом случае, когда я нажимаю любую клавишу, я получаю это исключение:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: scala.swing.Frame$$anon$1 cannot be cast to javax.swing.JComponent
    at scala.swing.event.KeyPressed.<init>(KeyEvent.scala:33)
    at pip.gui.ImageView$keys$$anon$2.keyPressed(ImageView.scala:35)
    at java.awt.Component.processKeyEvent(Component.java:6225)
    at java.awt.Component.processEvent(Component.java:6044)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Window.processEvent(Window.java:1836)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
    at 
.
.
.
.
(continues long further)

Я вывел этот код издателя из Component.keys, так что здесь на самом деле не так?

Заранее спасибо, Tony

1 Ответ

2 голосов
/ 04 апреля 2011

Это кажется плохим дизайном в библиотеке. Если посмотреть на KeyEvent.scala, то есть все виды приведения к JComponent, и JFrame является подклассом java.awt.Component, но не JComponent, поэтому нельзя назвать listenTo(keys).

Вам нужно прослушать самый верхний компонент в contents фрейма. Например:

import scala.swing._; import event._
import javax.swing._

class ImageView(image: ImageIcon, parent: UIElement = null) extends MainFrame {
   val b = new BorderPanel {
      listenTo( keys )
      reactions += {
         case KeyPressed(_, key,_,_) =>
            println( "PRESSED : " + key )
            if (key == Key.Escape) dispose
      }
   }
   contents = b
}

val w = new ImageView( null )
w.peer.setSize( 200, 200 )
w.visible = true
w.b.requestFocus

requestFocus важен, потому что панель сама не запрашивает фокус, даже если вы нажмете на нее, иначе она не получит ключевые события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...