java Swing中requestFocusInWindow()和grabFocus()的区别
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17680817/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Difference between requestFocusInWindow() and grabFocus() in Swing
提问by JavaTechnical
I would like to know the difference between requestFocusInWindow()
and grabFocus()
methods. Both of them work fine for grabbing the focus for me in this program. Therefore, i couldn't understand the difference.
我想知道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();
}
});
}
}
回答by JavaTechnical
The answer is simple, grabFocus()
grabsthe focus, no matter whether the top-level ancestor is the focused window. If the window is not active, then it is made active to let the component get the focus.
答案很简单,grabFocus()
抓住焦点,不管顶层祖先是否是焦点窗口。如果窗口未处于活动状态,则将其激活以让组件获得焦点。
Whereas, requestFocusInWindow()
gets the focus for the component on which it is called onlywhen its top-level ancestor is the focused window.
然而,只有当它的顶级祖先是聚焦窗口时requestFocusInWindow()
,才获得调用它的组件的焦点。
In your example, JDialog
is the top level ancestor, it gets focus automatically when the JButton
is clicked. So requestFocusInWindow()
and grabFocus()
does not make a difference.
在您的示例中,JDialog
是顶级祖先,JButton
单击时它会自动获得焦点。所以requestFocusInWindow()
,grabFocus()
并没有什么区别。
I have re-written the program to better understand the difference using a pragmatic approach.
我重新编写了程序,以使用务实的方法更好地理解差异。
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();
}
});
}
}
Here, requestFocusInWindow()
is called on jt
and it doesn't work (i.e. jt
doesn't get the focus) because the JDialog
is made active when the JButton
is clicked and JTextField
in the JDialog
gets the focus.
在这里,requestFocusInWindow()
被调用jt
并且它不起作用(即jt
没有获得焦点),因为JDialog
当JButton
单击 并JTextField
在 中JDialog
获得焦点时被激活。
Next, grabFocus()
works. When the JButton
is clicked, JDialog
is displayed, but will not be active. Because upon call to the grabFocus()
, immediately the JFrame
becomes the active top-level ancestor and jt
is forcedto get the focus.
接下来,grabFocus()
工作。当JButton
被点击时,JDialog
显示出来,但不会被激活。因为调用后grabFocus()
,立即JFrame
成为活动的顶层祖先和jt
被强迫获取焦点。