java - 无法即时将 JPanel 添加到 JFrame

标签 java model-view-controller swing miglayout

我有观点:

  1. MainWindowView(扩展 JFrame)
  2. 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/

相关文章:

java - 为什么这个 ReadWriteLock 示例不起作用?

java - 运行时无法识别等于默认值的 Proto3 设置值

javascript - spine、backbone、jsmvc 等 js mvc 库如何集成到基于服务器的 MVC 框架(如 lithium 或 zend)中?

linux - Linux 世界中可用的 MVC Web 框架有哪些?

java - 如何将 Icon 设置为 JButton 而不会在按下时丢失动画?

java - 将四个按钮放置在十字形图案中,但彼此靠近

java - 在Java中,如何获得索引长度为10^5位的数字字符串的子序列

java - 从 ArrayList 获取 double 的平均值

Java MVC : updating View that observes multiple Models

Netbeans gui 上的 Java Keypressed 事件不起作用?