首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为MainFrame编写自己的密钥发布器

为MainFrame编写自己的密钥发布器
EN

Stack Overflow用户
提问于 2011-04-04 02:18:14
回答 1查看 658关注 0票数 0

我希望我的MainFrame能够捕捉关键事件。我没有找到任何已经在其中的关键出版商,所以我将编写我自己的...我有这样的东西:

代码语言:javascript
复制
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
  }

}

无论如何,当我按任何键时,我都会得到这样的异常:

代码语言:javascript
复制
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调出了这段发布器代码,那么这里到底出了什么问题呢?

提前谢谢你,托尼

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-04 05:03:22

在库中这似乎是一个糟糕的设计。纵观KeyEvent.scala,有各种各样的类型转换到JComponentJFramejava.awt.Component的子类,但不是JComponent,所以调用listenTo(keys)应该是不可能的。

您想要的是监听框架的contents中最顶部的组件。例如:

代码语言:javascript
复制
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是必不可少的,因为即使你点击它,面板本身也不会请求焦点,否则它就不会收到按键事件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5531512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档