更改JFrame的内容窗格后的焦点组件

时间:2015-09-07 14:55:29

标签: java swing focus

我正在更改我的>brew install python >brew install sip >brew install pyqt 内容窗格,只想将JFrame重点放在新面板中。所以我这样做:

JTextField

当我使用JPanel pNew = new JPanel(); frame.setContentPane(pNew); frame.revalidate(); frame.repaint(); public JPanel() { ... tf.requestFocusInWindow(); } setVisible(false)而不是重新验证和重新绘制我的框架时,我得到了我希望的效果,但这不是我想要的方式。

setVisible(true)还发生了什么,但重新验证并重新粉饰?

2 个答案:

答案 0 :(得分:2)

CardLayout通常用于交换面板。

但是,即使是CardLayout的默认实现,也不会在交换时将焦点设置在面板上。但是,您可以查看Card Layout Focus,这样您就可以在切换时请求关注面板。

requestFocusInWindow()方法仅适用于在可见框架中显示的组件。因此,您无法在类的构造函数中调用该方法。

您可以使用Dialog Focus中的RequestFocsListener。在生成事件之前,它将等待面板添加到可见的GUI中。

答案 1 :(得分:1)

我只需将requestFocusInWindow()调用放在按钮的动作侦听器中即可实现。正如camickr所说,需要在构造函数之后进行调用。这是一个示例程序,展示了我如何使它工作。希望它有所帮助!

public class PanelRevalidate {
    public JFrame frame;
    public MyPanel panel1, panel2;

    public PanelRevalidate() {
        frame = new JFrame();
        panel1 = new MyPanel(1);
        panel2 = new MyPanel(2);
        frame.setContentPane(panel1);

        panel1.getSwap().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setContentPane(panel2);
                frame.revalidate();
                panel2.getTextField().requestFocusInWindow();
            }
        });

        panel2.getSwap().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setContentPane(panel1);
                frame.revalidate();
                panel1.getTextField().requestFocusInWindow();
            }
        });

        frame.setVisible(true);
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new PanelRevalidate();
            }
        });
    }

}

MyPanel课程:

public class MyPanel extends JPanel {

    public JTextField tf;
    public JButton swap;
    public JLabel panel_label;

    public MyPanel(int n) {
        tf = new JTextField(25);
        swap = new JButton("Swap");
        panel_label = new JLabel("panel " + n);

        add(tf);
        add(swap);
        add(panel_label);
    }

    public JButton getSwap() {
        return swap;
    }

    public JTextField getTextField() {
        return tf;
    }

}