2011-01-09 215 views
12

我有一個在NetBeans中開發的應用程序,我想在顯示面板時將焦點設置爲某個jTextField。我讀了一些帖子,並嘗試過各種方法,但沒有工作。主要問題之一是在哪裏放置所需的代碼,我相信我的情況是this.txtMessage.requestFocusInWindow();將焦點設置爲文本字段

有一些帖子指出使用Window Listener,但是由於netbeans已經生成了GUI,我看不到如何實現接口,因爲我不能編輯創建jPANEL的代碼等等。整個事情非常令人沮喪,我真的不相信這應該是那麼困難。

正如測試我添加requestFocusInWindow();到面板上的按鈕,它也將焦點設置到所期望的輸入。

+1

您是否必須使用NetBeans代碼生成,因爲在手動創建的Swing項目中這樣做通常要容易得多。就個人而言,這是我認爲使用代碼生成器創建複雜的Swing項目(比如通過NetBean的Matisse)比手動創建代碼困難得多的原因之一。 – 2011-01-09 16:05:47

回答

15

我有過類似的情形,其中當面板顯示時,我需要將焦點設置在面板內的文本框中。面板在應用程序啓動時加載,所以我無法在構造函數中設置焦點。由於該小組沒有被加載或被重點放在節目上,這意味着我沒有事件來解決焦點請求。

爲了解決這個問題,我添加了一個全球性的方法,我的主要調用在對文本區域援引requestFocusInWindow()面板的方法。我把這個調用的全局方法放在了顯示面板的按鈕上,之後的調用顯示。這意味着將顯示面板,然後在顯示面板後文本區域被分配焦點。希望這是有道理的,並幫助!

此外,您還可以通過右鍵單擊設計視圖中的對象並選擇自定義代碼編輯大多數自動生成的代碼,但我不認爲它允許你編輯面板。

10

我不知道如果我失去了一些東西,但沒有理由爲什麼你不能一個監聽器添加到您的面板。

在NetBeans中,正好打在「源」按鈕,在編輯器窗口的左上角,您可以編輯大部分代碼。實際的佈局代碼大多被鎖定,但如果需要,甚至可以自定義。

據我所知,txtMessage.requestFocusInWindow()應該建立在顯示窗口在第一時間爲默認焦點。如果您想請求的焦點已被顯示的窗口之後,你應該使用txtMessage.requestFocus()

爲了測試,你可以在構造函數中添加一個偵聽器:

addWindowListener(new WindowAdapter(){ 
    public void windowOpened(WindowEvent e){ 
    txtMessage.requestFocus(); 
    } 
}); 
+1

你不應該使用requestFocus()。閱讀該方法的API描述。 requestFocusInWindow()是使用的正確方法。 – camickr 2011-01-09 17:14:42

+0

嗨Riaan,並感謝您的答覆,問題是與JPanel多數民衆贊成在我想設置的焦點jTextField。主窗口在需要時加載JPanel,txtMessage.requestFocus()不起作用。並且在主窗口中添加一個窗口監聽器看起來像是浪費時間,因爲它加載了一些JPanel而不僅僅是包含文本字段的文件等。 – Lee 2011-01-09 19:42:14

3

在JFrame或JDialog中,您總是可以覆蓋setVisible()方法,它運行良好。我沒有嘗試過JPanel,但可以替代。

@Override 
public void setVisible(boolean value) { 
    super.setVisible(value); 
    control.requestFocusInWindow(); 
} 
0

,我得到它的工作的最簡單的方法,就是把component.requestFocus();線,該線setVisible(true);後,在你的框架或面板構造的底部。

在創建所有組件之後,這可能與詢問焦點有關,因爲在詢問焦點請求後創建新組件會使組件鬆散,並使焦點轉向您新創建的組件。至少,這就是我所假設的。

1

我已經玩了這個永遠的,終於找到似乎總是工作的東西!

textField = new JTextField() { 

     public void addNotify() { 
      super.addNotify(); 
      requestFocus(); 
     } 
    }; 
0

以上都不適合我,因爲我的窗口是JPopupMenu

什麼做的工作是這樣的:

addAncestorListener(new AncestorListener() { 
    @Override 
    public void ancestorAdded(AncestorEvent ae) { 
     myEdit.requestFocus(); 
    } 

    // ... other ancestor listener methods 
} 
0

我做到了通過設置文本字段和AncesterAdded事件請求焦點窗口。

0

如果您創建GUINetbeans的,還可以插入一些自我編寫的代碼。只需選擇一個元素(可能是按鈕,面板或窗口)並使用「屬性」對話框中的「代碼」選項卡。

在那裏,你可以插入和創造過程的各個部分代碼。

我認爲窗口的「After-All-Set-Code」字段是您的代碼的好地方,或者您可以將其綁定到事件(「Properties」--dialog - >「Events」)「componentShown「的文本字段/面板。