无法在运行时将JPanel添加到JFrame

3

我有两个视图:

  1. MainWindowView(扩展JFrame)
  2. ScanOptimisationView(扩展JPanel)

所以,我在MainWindowView类中有一个下拉框。我创建了ActionListener并将其绑定到此下拉框上。这个ActionListener的actionPerformed()方法尝试将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()中使用代码时,面板没有显示出来,但是当我使用下面的代码时,面板会显示出来?

1个回答

5
在无法工作的情况下,当您的ActionListener调用frmContainer.add()之后,您需要调用frmContainer.validate()。从Container.add()的Javadocs中可以看到:
“如果将组件添加到已显示的容器中,则必须在该容器上调用validate以显示新组件。”
当您响应单击时,您的容器显然已经被显示。在构造函数中添加JPanel时,您的JFrame还没有被显示。

它运行良好!谢谢!我需要更加注意文档 :) - Dmitry Belaventsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接