3

我不得不意见:

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

所以,我在 MainWindowView 类中有组合框。我创建 ActionListener 并将其绑定到这个组合框。此 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() 中的代码,但是当我使用下面的代码时它会显示出来?

4

1 回答 1

5

在非工作情况下,在您的 actionListener 调用之后frmContainer.add(),您需要调用frmContainer.validate(). 来自 Container.add() 的 Javadocs:

“如果组件已添加到已显示的容器中,则必须在该容器上调用 validate 以显示新组件。”

当您响应点击时,您的容器显然已经显示出来了。当您在构造函数中添加 JPanel 时,您的 JFrame 尚未显示。

于 2011-12-24T07:33:00.433 回答