我有一个框架和一个面板,永久删除面板并添加另一个面板。添加新面板后,我需要JTextField来聚焦,该如何做?
我尝试了panel.requestFocus()
方法,但没有成功。
示例代码:
public class Test{
public static void main(String[] args){
JFrame frame = new JFrame();
// ... frame options
// MyPanel extends JPanel
// and has a JTextField
contentPane.add(new MyPanel());
// Permanently I need to add another panel
contentPane.removeAll();
contentPane.add(new MyPanel());
}
}
最佳答案
调用panel.requestFocus()
会尝试将焦点放在容器本身而不是容器的任何子组件上。
将组件添加到JTextField
后,在JFrame
上使用requestFocusInWindow。在MyPanel
中添加一个公共方法以调用此方法。
避免使用requestFocus
。从docs:
不建议使用requestFocus,因为它试图将焦点放在组件的窗口上,而这并非总是可能的。从JDK 1.4开始,应改为使用requestFocusInWindow方法,该方法不会尝试使组件的窗口聚焦。
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Focus JTextField");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel myPanel = new MyPanel();
frame.add(myPanel);
frame.setVisible(true);
frame.pack();
myPanel.focusTextField();
}
});
}
}
class MyPanel extends JPanel {
private JTextField textField;
public MyPanel() {
textField = new JTextField(20);
add(textField);
}
public void focusTextField() {
textField.requestFocusInWindow();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 100);
}
}