加载包含另一个 JPanel 的 JPanel

load JPanel that contains another JPanel

我正在尝试加载一个 Class,它扩展了 JPanel 并具有来自另一个 Class 的组件,该 Class 也将 JPanel 扩展到另一个 Class。

这就是我需要实现的目标:

First.java

的例子
  public class First extends JPanel{
      JPanel cont = new JPanel();
          public First(){
          cont.setBackground(Color.YELLOW);
          }
       }

Second.java

的例子
  public class Second extends JPanel{
      JPanel cont = new JPanel();
      First first_panel = new First();
          public Second(){
          cont.setBackground(Color.RED);
          cont.add(first_panel);
          }
      }

Container.java

的例子
   public class Container extends JFrame{
       JFrame frame = new JFrame();
       JPanel cont = new JPanel();
       Second second_panel = new Second();
          public Container(){
          cont.setBackground(Color.GREEN);
          cont.add(second_panel);
          frame.add(cont);
          frame.setVisible(true);
          }
      }

我能够一个一个地加载 类 但是当我尝试加载包含另一个 panel.class 的面板时,GUI 没有不要展示它。逻辑有什么问题?有什么问题吗?

显示的代码中存在两个基本问题。

  1. 每个 class 都扩展了它所处理的组件的实例。
  2. 两个面板都没有任何内容可以赋予它非零大小,也没有覆盖 getPreferredSize 方法,所以它们是 0x0 像素。

看看这个MCVE的效果。

import java.awt.Color;
import javax.swing.*;

public class Container {

    JFrame frame = new JFrame();
    JPanel cont = new JPanel();
    Second second_panel = new Second();

    public Container() {
        cont.setBackground(Color.GREEN);
        cont.add(second_panel.getPanel());
        frame.add(cont);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                new Container();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class Second {

    JPanel cont = new JPanel();
    First first_panel = new First();

    public Second() {
        cont.setBackground(Color.RED);
        cont.add(new JLabel("Second"));
        cont.add(first_panel.getPanel());
    }

    public JComponent getPanel() {
        return cont;
    }
}

class First {

    JPanel cont = new JPanel();

    public First() {
        cont.setBackground(Color.YELLOW);
        cont.add(new JLabel("First"));
    }

    public JComponent getPanel() {
        return cont;
    }
}