2011-07-28 43 views
2

我知道你可以調用JComponent.setFocusable(false)來使Java組件不被關注。但是因爲我在應用程序中有很多組件,所以我想知道是否有比在幾十個對象中調用它更簡單的方法。像UIDefaults值?是否有可能使JComponent默認爲不可聚焦?

我在找這個,因爲我的應用程序全屏運行,JFrame上有一個KeyListener,它偵聽按鍵觸發各種事件。但是我發現無論何時點擊一個JButton或其他添加的組件,它都會獲得焦點,關鍵事件永遠不會到達JFrame。因此,無論孩子有什麼焦點,都可以通過單個父容器捕獲關鍵事件的更優雅的方式來解決我的問題。

回答

3

我想知道是否有比在幾十個對象上調用它更簡單的方法。

我從來沒有見過一個。

JFrame上有一個KeyListener,用於偵聽按鍵觸發各種事件。

請勿使用KeyListener。

相反,您可以使用JMenus和JMenuItems加速器。這種方法的好處是,關鍵筆畫然後是菜單中的文檔。請參閱How to Use Menus上的Swing教程部分。

或者如果你不喜歡菜單,那麼你應該使用Key Bindings。即使組件沒有焦點,它們也可以被編碼以工作。

+0

只是一個小心當心:菜單加速器只能如預期的,如果他們是唯一的 - 與聚焦時窗口綁定是最後一個只有在沒有人想要的時候才能看到它們它們。 – kleopatra

+0

我使用Key Bindings而不是KeyListener,而且這樣做。至少有一次,我開始爲InputMap使用JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT標誌。 –

+0

@Mike,然後論壇程序是「接受」你使用的答案。 – camickr

1

如何:

public boolean getComponent(Container c) 
{ 
    Component[] cmps = c.getComponents(); 
    for(Component cmp : cmps) 
    { 
     if(cmp instanceof JComponent) // or even you could specify the JComponent you want to make it not-focusable, for example (cmp instanceof JButton) 
     { 
      ((JComponent)cmp).setFocusable(false); 
      return true; 
     } 
     if(cmp instanceof Container) 
     { 
      if(getComponent((Container) cmp)) return true; 
     } 
    } 
    return false; 
} 

然後,只需調用它通過:

getComponent(YourJFrame); 
+0

我懷疑你想要「迴歸真實」在那裏... –

0

這裏是走在樹,把它放在你所關心的元素,而粗暴的方式。只是通過一組noFocus的(或更改邏輯只是一切)...

public static List<Component> disableFocus(final Container c, Set<Component> noFocus) { 
    Component[] comps = c.getComponents(); 
    for (Component comp : comps) { 
     if (noFucus.contains(comp) { comp.setFocusable(false); } 
     if (comp instanceof Container) { 
     disableFocus(comp); 
     } 
    } 
    } 
+1

懷疑你想篡改症狀;-) – kleopatra

相關問題