2013-08-16 92 views
0

我創建了JWindow,其中有幾個JTextInput字段。這個JWindow父母是JFrame。現在的情況 - 如果文本字段被點擊 - 他們得到的焦點,但仍然保持專注但仍然JWindow。那很好。但是,如果我創建另一個JWindow(第一個子項JWindow),並將其設置爲可見,那麼首先關注JWindow已丟失,並重點關注子項JWindow。這不好。有沒有辦法保留專注於父母JWindow,並使子女JWindow獲得像JTextInput這樣的關注領域?讓JWindow在兒童聚焦時保留焦點,包括另一個兒童窗口

回答

2

將子窗口設置爲可見之前,請添加一個WindowListener。在子窗口上撥打setVisible後,您將收到windowActivated回撥。此時,請在您的父窗口上撥打toFront將其轉發。鑑於OS z順序處理的怪異性,您可能需要/想要先在子窗口上調用toBack,並在父窗口或之後調用其中一個可聚焦子項,然後調用requestFocus

+0

是的,提示是正確的。 –

4

的JWindow無父也絕不會成爲焦點,然後仔細絕不JTextComponents將編輯

例如

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

public class WindowTest { 

    private JFrame frame; 
    private boolean bol = true; 

    public WindowTest() { 
     frame = new JFrame("Window Test"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
     JWindow win = new JWindow(frame); 
     win.setLayout(new GridLayout(0, 1)); 
     JTextField text = new JTextField("Show Window"); 
     text.getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent e) { 
       if (!bol) { 
        JWindow win = new JWindow(); 
        win.setLayout(new GridLayout(0, 1)); 
        win.add(new JTextField("JTextField")); 
        win.add(new JTextField("JTextField")); 
        win.add(new JLabel("<html> Concurency Issues in Swing<br>" 
          + " never to use Thread.sleep(int) <br>" 
          + " durring EDT, simple to freeze GUI </html>")); 
        win.pack(); 
        win.setLocation(350, 150); 
        win.setVisible(true); 
        bol = true; 
       } 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
      } 
     }); 
     win.add(text); 
     win.add(new JTextField("JTextField")); 
     win.add(new JTextField("JTextField")); 
     win.pack(); 
     win.setLocation(250, 150); 
     win.setVisible(true); 

     bol = false; 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new WindowTest(); 
      } 
     }); 
    } 
} 
+0

不錯的例子,以前不知道。其實我已經解決了這個問題,通過限制如果子JWindow獲得焦點來改變我的父JWindow的自定義標題欄的顏色(不活動)。再次感謝:) –

+0

此外,在閱讀完這些代碼之後,我不得不使用'WindowFocusListener'和'FocusListener'「截至此版本,顯示JPopupMenu會導致焦點轉移到父JRootPane。這樣做是爲了讓JPopupMenus能夠支持鍵盤遍歷...「來自[這裏](http://download.java.net/jdk8/docs/technotes/guides/swing/1.4/SwingChanges.html)。我認爲在JWindow獲得焦點時(JWindow父窗口保留窗口焦點),有一些設置的行爲與JTextField類似。 –

+0

因爲從Java1.4不可能保持可見而沒有Focus,鬆散的Fosus隱藏JPopup或BasicComboBoxPopup – mKorbel