2011-05-31 68 views
2

我有一个JTextField和AWT Canvas的简单GUI(为了防止为什么我使用AWT Canvas的反问题:我需要有一个窗把手)。AWT Canvas无法获得另一个可聚焦组件的存在焦点

画布是处理输入事件,这意味着它必须是可以聚焦的。我通过在构造函数中使用setFocusable(true)来保证这一点,后来使用isFocusable()进行检查确认它确实是可以聚焦的。

现在,JTextField在GUI打开时默认获得焦点。到目前为止我没有问题。但是,没有办法从该JTextField获取远离的焦点。

文章"The AWT Focus Subsystem"明确指出,如果点击某个可调焦组件,它将获得焦点。这不会发生,事实上,只有当窗口被取消激活并再次激活时,我才会收到零焦点更改事件,但是焦点会立即返回到JTextField。

显式调用requestFocus()requestFocusInWindow()也没有帮助,后者总是返回false

如果我替换JTextField,我已经获得了与任何可聚焦组件相同的结果。如果Canvas是唯一可以调焦的容器,那么一切正常,因为它始终有焦点。

我失去了一些东西在这里?有没有什么办法可以让我的Canvas增益聚焦在另一个可聚焦组件的存在下,最好是不让这个聚焦组件变焦?

+0

你确定'setEnabled(true)'确定吗?你可以用'isEnabled'来检查。 – toto2 2011-05-31 13:52:23

+0

是的,它已启用。如果Canvas本身就在那里,这一切都可以正常工作。就在其他可聚焦组件/刚刚用JButton尝试过时,稍后会编辑主要问题)就会参与其中,但它根本无法获得重点。 – pdinklag 2011-06-01 04:46:41

回答

1

对不起,遗漏了一些信息,结果是问题的根源。

如上所述,我使用重量级组件,所以我有一个窗口句柄。我需要一个,因为它被传递给本地库中的OpenGL应用程序,AWT画布随后被用作渲染画布。

在Windows中,Java使用GWLP_USERDATA窗口字段存储指向AWTComponent对象的指针。但是,OpenGL应用程序会覆盖该字段以存储其自己的Window对象指针,这当然会破坏所有AWT相关的功能。

我通过创建自定义窗口消息处理程序将传入消息委托给OpenGL应用程序和Java的AWT部件来解决此问题。

1

基本上在摆动焦点获得第一。在最完整的GUI留在顶部

(ToRight)JComponents,如果有(与创建JComponents一起)添加监听到JComponents,那么这些监听器(FE文件)可以采取重点...

但对我起作用:

last lines in something class about JComponets .. 

myFrame.pack(); 
myFrame.setVisible(true); 
Runnable doRun = new Runnable() { 

    public void run() { 
     myComponent.grabFocus(); 
     myComponent.requestFocus();//or requestFocusInWindow 
    } 
}; 
SwingUtilities.invokeLater(doRun); 
+0

那么,即使假设这是有效的,这会给我的Canvas默认的焦点*。一旦人们使用文本字段,我会再次遇到同样的问题:Canvas如何重新获得焦点? 我已经尝试添加一个鼠标监听器的画布要求焦点一旦点击,没有运气('requestFocusInWindow'总是返回'false','requestFocus'也不会做任何事情)。 顺便说一下,那个方法'grabFocus'不存在(我没有使用JComponent,而是'java.awt.Canvas'。 – pdinklag 2011-06-01 04:49:46

+0

@pdinklag最简单的就是...,我认为真的要发布时间代码显示了我们尝试过的内容,取决于Canvas如何添加到另一个JPanel,JSchrollPane ... – mKorbel 2011-06-01 06:05:01