我有观点:
- MainWindowView(扩展 JFrame)
- ScanOptimisationView(扩展 JPanel)
所以,我在 MainWindowView 类中有组合框。然后我创建 ActionListener 并将其绑定(bind)到此组合框。此 ActionListener 的 actionPerfomed() 方法尝试将 ScanOptimisationView 面板添加到主窗口框架。这是代码:
package ru.belaventcev.view;
import java.awt.Container;
public class MainWindowView extends JFrame{
private int frmHeight = 525;
private int frmWidth = 650;
public Container frmContainer;
public static JButton btnCalc;
public static JComboBox cbMethods;
public MainWindowView(){
setPreferredSize(new Dimension(frmWidth, frmHeight));
setSize(frmWidth, frmHeight);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
frmContainer = getContentPane();
frmContainer.setLayout(new MigLayout("", "[grow,center]", "[::30px,grow,center][grow,center][::500px,grow,center][::25px,grow,center]"));
cbMethods = new JComboBox();
cbMethods.setModel(new DefaultComboBoxModel(new JPanel[] {new ScanOptimisationView()}));
cbMethods.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel temp = (JPanel) cbMethods.getSelectedItem();
frmContainer.add(temp, "cell 0 1,span");
}
});
/*
* If I uncomment this, panel is shown!
JPanel temp = (JPanel) cbMethods.getSelectedItem();
frmContainer.add(temp, "cell 0 1");
*/
frmContainer.add(cbMethods, "cell 0 0,growx");
btnCalc = new JButton("Расчитать");
frmContainer.add(btnCalc, "cell 0 3,alignx right");
}
}
你能帮我理解 - 为什么面板没有显示在 actionPerformed() 中的代码,但当我使用下面的代码时却显示了?
最佳答案
在非工作情况下,在您的 actionListener 调用 frmContainer.add()
之后,您需要调用 frmContainer.validate()
。来自 Container.add() 的 Javadocs:
“如果组件已添加到已显示的容器,则必须在该容器上调用验证以显示新组件。”
当您响应点击时,您的容器显然已经显示出来。当您在构造函数中添加 JPanel 时,您的 JFrame 尚未显示。
关于java - 无法即时将 JPanel 添加到 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623298/