我有一个带有JTextField和AWT Canvas的简单GUI(以防止有人质疑我为什么使用AWT Canvas:我需要一个窗口句柄)。

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

现在,默认情况下,当GUI打开时,JTextField将获得焦点。到目前为止,我还好。但是,没有办法将焦点从该JTextField移开。

文章"The AWT Focus Subsystem"明确指出,如果单击可聚焦组件,它将获得焦点。实际上不会发生这种情况,实际上,仅当窗口被停用并再次激活时,我才会收到零焦点更改事件,但是焦点恰好回到JTextField。

requestFocus()requestFocusInWindow()的显式调用均无济于事,后者总是返回false

如果替换JTextField,则任何可聚焦组件的结果都相同。如果Canvas是唯一可聚焦的容器,那么一切都会正常进行,因为它将始终具有焦点。

我在这里想念什么吗?在存在其他可聚焦组件的情况下,有什么方法可以使我的Canvas获得聚焦,最好不要使该对象无法聚焦?

最佳答案

基本上在挥杆焦点上获得了第一名。顶部的left(ToRight)JComponents

在大多数完成的GUI中,如果在那里(连同创建JComponent)一起将侦听器添加到JComponent,则这些侦听器(例如Document)可以成为重点...

但在启动时对我有用:

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);

关于java - 在存在其他可聚焦组件的情况下,AWT Canvas无法获得聚焦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6187472/

10-14 12:07