Différence entre requestFocusInWindow() et grabFocus() en Swing
Je voudrais savoir la différence entre requestFocusInWindow()
et grabFocus()
méthodes. Les deux fonctionnent très bien pour l'accaparement de la me dans ce programme. Par conséquent, je ne pouvais pas comprendre la différence.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Focus extends JFrame
{
JButton jb;
public Focus()
{
createAndShowGUI();
}
private void createAndShowGUI()
{
setTitle("grabFocus() vs requestFocusInWindow()");
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jb=new JButton("Open Dialog");
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae)
{
showDialog();
}
});
add(jb);
}
private void showDialog()
{
JDialog jd=new JDialog();
jd.setLayout(new GridLayout(2,2));
jd.setVisible(true);
JLabel l1=new JLabel("Label 1");
JLabel l2=new JLabel("Label 2");
JTextField jt1=new JTextField(20);
JTextField jt2=new JTextField(20);
jd.add(l1);
jd.add(jt1);
jd.add(l2);
jd.add(jt2);
//Both of them are doing the thing
//jt2.grabFocus();
jt2.requestFocus();
jd.pack();
}
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
new Focus();
}
});
}
}
OriginalL'auteur JavaTechnical | 2013-07-16
Vous devez vous connecter pour publier un commentaire.
La réponse est simple,
grabFocus()
attrape l'accent, peu importe si le haut-niveau de l'ancêtre est la fenêtre active. Si la fenêtre n'est pas active, il est actif pour laisser la composante obtenir le focus.Alors que,
requestFocusInWindow()
obtient le focus pour le composant sur lequel elle est appelée seulement lors de son haut niveau de l'ancêtre est la fenêtre active.Dans votre exemple,
JDialog
est le plus haut niveau de l'ancêtre, il obtient le focus automatiquement lorsque leJButton
est cliqué. DoncrequestFocusInWindow()
etgrabFocus()
ne pas faire une différence.J'ai ré-écrit le programme afin de mieux comprendre la différence à l'aide d'une approche pragmatique.
Ici,
requestFocusInWindow()
est appelée surjt
et ça ne fonctionne pas (c'est à direjt
ne pas obtenir le focus), parce que leJDialog
est active lorsque leJButton
est cliqué etJTextField
dans leJDialog
obtient le focus.Prochaine,
grabFocus()
œuvres. Lorsque leJButton
est cliqué,JDialog
est affiché, mais ne sera pas actif. Parce que lors de l'appel à lagrabFocus()
, immédiatement leJFrame
devient actif haut niveau de l'ancêtre etjt
est forcé pour obtenir le focus.nouveau JDialog (voir mon commnent) sans parent, sans enveloppé dans invokeLater, puis JDialog est de se concentrer propriétaire (tas de cas sur HAE) et ne peut pas définir le focus à JDialogs childs, ni renvoie vers JFrame
Mais la question est seulement à propos de la différence entre
requestFocusInWindow()
etgrabFocus()
, l'OP n'a jamais demandé sigrabFocus()
n'est pas utilisé. C'est un complément d'info. Une réponse sans plus d'infos voter dans StackOverflow? Je veux juste savoir! 😉La différence, c'est que le programmeur est supposé utiliser l'un et pas l'autre dans le code de l'application, pas de l'effet qu'on en donne, car comme l'a dit en Java Docs, cette partie appartient à la Focalisation de la mise en œuvre. Il me semble, l'affichage de cette question qui est mal, en premier lieu, lorsque Java Docs indique clairement la méthode qui sera utilisée dans le Code Client.
Et n'est-ce pas la réponse à une différence du tout!! OK. Pourriez-vous m'expliquer la raison pour laquelle le client pourrait ne devriez pas utiliser la méthode?
OriginalL'auteur JavaTechnical