2017-10-05 6 views
2

Je cours une application avec un comportement similaire à celui du scénario de test ci-dessous. Le problème est que lorsque vous basculez le focus sur une fenêtre différente en cliquant dessus et en gardant le cadre de l'application ci-dessous en vue, puis cliquez directement dans le champ de texte avec l'écouteur focusGained, fermez la boîte de dialogue, puis toutes les touches être perdu à tous les champs de texte dans l'application.Java 8 - Perdre toutes les entrées au clavier ou se concentrer après avoir changé de fenêtre

Si vous cliquez d'abord sur l'application ou sur l'icône dans la barre des tâches pour obtenir le focus, cela ne se produit pas.

C'est Java 8 spécifique - en Java 7, il ne sera pas perdre le focus, pas sûr java 9 mais ce n'est pas une option de toute façon

Le cas de test ci-dessous montre ce comportement.

public class FocusTest extends JFrame 
{ 
    JTextField noFocus; 

    public static void main(String[] args) 
    { 
     FocusTest ft = new FocusTest(); 
     ft.setVisible(true); 
    } 

    public FocusTest() 
    { 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setBounds(100,100,300,150); 
     setLayout(new GridLayout(3,1, 2, 2)); 
     setTitle("Losing keyboard..."); 
     noFocus = new JTextField(); 
     add(noFocus); 

     JTextField jft = new JTextField(); 
     jft.addFocusListener(new FocusAdapter() 
     { 
      @Override 
      public void focusGained(FocusEvent e) 
      { 
       createDialog().setVisible(true); 
       noFocus.requestFocusInWindow(); 
      } 
     }); 
     add(jft); 

     JButton jb = new JButton("OPEN"); 
     jb.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       if(e.getActionCommand().equals("OPEN")) 
        createDialog().setVisible(true); 
      } 
     }); 
     add(jb); 
    } 

    private JDialog createDialog() 
    { 
     final JDialog jd = new JDialog(this, true); 
     jd.setLocationRelativeTo(this); 
     jd.setLayout(new BorderLayout()); 
     jd.getContentPane().add(new JTextField(), BorderLayout.CENTER); 
     JButton jb = new JButton("Close"); 
     jb.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       if(e.getActionCommand().equals("Close")) 
        jd.dispose(); 
      } 
     }); 
     jd.getContentPane().add(jb, BorderLayout.SOUTH); 
     jd.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     jd.pack(); 
     return jd; 
    } 
} 

Répondre

2

pas exactement ce qui se passe, mais une solution est d'utiliser un SwingUtilities.invokeLater():

@Override 
public void focusGained(FocusEvent e) 
{ 
    noFocus.requestFocusInWindow(); 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
       createDialog().setVisible(true); 
     } 
    }); 
} 

Cela permettra au champ de texte pour se concentrer correctement avant de la boîte de dialogue est rendu visible.

+0

Oui, merci. Je trouve troublant que cela a changé le comportement entre 7 et 8 cependant. –