我正在更改我的>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)
还发生了什么,但重新验证并重新粉饰?
答案 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;
}
}