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;
}
}
Oui, merci. Je trouve troublant que cela a changé le comportement entre 7 et 8 cependant. –