Java Swing中requestFocusInWindow()和grabFocus()之间的差异

Java Swing中requestFocusInWindow()和grabFocus()之间的差异,java,swing,focus,Java,Swing,Focus,我想知道requestFocusInWindow()和grabFocus()方法之间的区别。他们两个都很好地为我抓住了这个节目的焦点。因此,我无法理解其中的区别 import javax.swing.*; import java.awt.*; import java.awt.event.*; class Focus extends JFrame { JButton jb; public Focus() { createAndShowGUI(); }

我想知道
requestFocusInWindow()
grabFocus()
方法之间的区别。他们两个都很好地为我抓住了这个节目的焦点。因此,我无法理解其中的区别

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();
            }
        });
    }
}

答案很简单,
grabFocus()。如果窗口未处于活动状态,则会使其处于活动状态以使组件获得焦点

然而,
requestFocusInWindow()
仅当其顶级祖先是聚焦窗口时,才获取其被调用的组件的焦点

在您的示例中,
JDialog
是顶级祖先,当单击
JButton
时,它会自动获得焦点。因此,
requestFocusInWindow()
grabFocus()
没有区别

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();
            }
        });
    }
}
我已经重新编写了程序,以便使用务实的方法更好地理解差异

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Focus extends JFrame
{
JButton jb;
JTextField jt;

    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);

        jt=new JTextField(20);

        add(jt);
    }

    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);

        jt.requestFocusInWindow();
        //jt.grabFocus();

        jd.pack();
    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                new Focus();
            }
        });
    }
}
在这里,
requestFocusInWindow()
jt
上被调用,但它不起作用(即
jt
没有获得焦点),因为当单击
JButton
并且
JDialog
中的
JTextField
获得焦点时,
JDialog
被激活


接下来,
grabFocus()。单击
JButton
时,会显示
JDialog
,但不会处于活动状态。因为一经调用
grabFocus()
,JFrame
立即成为活动的顶级祖先,
jt
强制获得焦点。

虽然你在这篇文章中没有提到真正的东西,但grabFocus()是不被使用的。一行来自,用于巩固声明-“此方法旨在供focus实现使用。客户端代码不应使用此方法;相反,它应使用requestFocusInWindow()”-1,因为:(再次JDialog(请参阅我的命令)没有父级,再次没有包装到invokeLater中,然后JDialog是焦点所有者(EDT上的一堆事件)无法将焦点设置为JDialogs childs,也无法将焦点返回到JFrame@nIcEcOw但问题只是关于
requestFocusInWindow()
grabFocus()
之间的区别,OP从未询问过
grabFocus()是否
是不可使用的。它是一个附加信息。没有附加信息的答案会在StackOverflow中被否决吗?我只是想知道!;)区别在于,程序员应该在应用程序代码中使用其中一个,而不是另一个,而不是一个,因为正如Java文档中所说,这部分属于焦点实现。在我看来,发布这个问题是错误的,首先,当Java文档清楚地说明在客户机代码中使用哪种方法时。答案一点也不不同!!好啊你能解释一下为什么客户不能使用这种方法吗?