我有一个框架和一个面板,永久删除面板并添加另一个面板。添加新面板后,我需要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);
    }
}

10-08 09:16