我想知道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;
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
没有获得焦点),因为单击JDialog
时JButton
处于活动状态,并且JTextField
中的JDialog
成为焦点。
接下来,grabFocus()
起作用。单击JButton
时,将显示JDialog
,但不会激活。因为一旦调用grabFocus()
,JFrame
立即成为活动的顶级祖先,并且jt
被强制获得焦点。