2013-08-16 57 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