2017-11-17 3 views
0

Innerhalb einer Java-Swing-Anwendung habe ich ein Textfeld mit einer Art Hilfe-Popup.
Das heißt, wenn der Benutzer mit der Maus innerhalb des Textfelds doppelklickt, wird dieses Popup (implementiert als undekoriertes JFrame) angezeigt.TextField verliert den Fokus auf andere Fenster

Sobald das Textfeld den Fokus verliert, ist dieses Popup wieder ausgeblendet.
Das Problem besteht darin, dass der Fokus bei der Anzeige dieses Popups automatisch auf diesen Frame verschoben wird und ein lostFocus-Ereignis im Textfeld ausgelöst wird. Dies schließt natürlich das Popup erneut.

Ich möchte, dass das lostFocus-Ereignis nur ausgelöst wird, wenn das Textfeld den Fokus auf eine andere Komponente im selben Fenster verliert.

Irgendeine Idee, wie man das erreicht?

+0

Überprüfen Sie, welches Objekt den Fokus erhalten hat, und blenden Sie das entsprechende Fenster aus. –

Antwort

1

Die Lösung ist einfacher, als ich dachte:
Im focusLost Rückruf, überprüfen Sie die isTemporary() Flagge.
Wenn dies eingestellt ist, ignorieren Sie das Ereignis.

UPDATE:
Wenn die ifTemporary() Flag gesetzt ist, bestimmt die Komponente, die den Fokus erhält (mittels getOppositeComponent()).
Wenn diese Komponente if null oder ihr übergeordnetes Fenster nicht unser Popup-Frame ist, schließen Sie das Popup trotzdem.

+1

'(implementiert als undekoriertes JFrame)' - Verwenden Sie einen undekorierten JDialog anstelle eines Frames. Eine Anwendung sollte nur einen einzelnen JFrame enthalten. – camickr

0

Überprüfen Sie, welches Objekt den Fokus erhalten hat, und blenden Sie das entsprechende Fenster aus.

dies ist ein grobes Beispiel

public class MainFrame extends JFrame { 

    private JWindow popupWindow; 

    public MainFrame() throws HeadlessException { 
     super("Main Frame"); 
     createGUI(); 
    } 

    private void createGUI() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setPreferredSize(new Dimension(600, 400)); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

     JTextField hintTextField = new JTextField(); 

     popupWindow = new JWindow(this); 
     popupWindow.getRootPane().setBorder(BorderFactory.createLineBorder(Color.RED)); 
     popupWindow.getRootPane().setLayout(new BorderLayout()); 
     popupWindow.getRootPane().add(hintTextField, BorderLayout.CENTER); 

     for(int i = 0; i < 10; i++) { 
      JTextField textField = new JTextField(); 
      textField.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        if(e.getClickCount() == 2) { 
         Point point = textField.getLocationOnScreen(); 
         popupWindow.setBounds(point.x, point.y + textField.getPreferredSize().height, 200, 200); 
         popupWindow.setVisible(true); 
        } 
       } 
      }); 

      textField.addFocusListener(new FocusAdapter() { 
       @Override 
       public void focusLost(FocusEvent e) { 
        if(e.getOppositeComponent() != hintTextField) { 
         popupWindow.setVisible(false); 
        } 
       } 
      }); 

      panel.add(textField); 
     } 

     add(panel, BorderLayout.PAGE_START); 

     pack(); 
     setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true)); 
    } 
} 
+0

Danke für den Hinweis, aber ich denke, ich fand eine einfachere Lösung (siehe meine Antwort). –

Verwandte Themen