java - 加载包含另一个 JPanel 的 JPanel

标签 java swing jpanel containers

我正在尝试加载一个扩展 JPanel 的类,并且具有来自另一个类的组件,该类也将 JPanel 扩展为另一个类。 enter image description here

这就是我需要实现的目标: enter image description here

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. 每个类都扩展并拥有它所处理的组件的实例。
  2. 两个面板都没有任何会赋予其非零大小的内容,也没有覆盖 getPreferredSize 方法,因此它们都是 0x0 px。

查看此 MCVE 的效果。

enter image description here

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;
    }
}

关于java - 加载包含另一个 JPanel 的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010290/

相关文章:

java - Eclipse WindowBuilder 在项目目录中生成 forms- 1.3.0.jar 和 miglayout15-swing.jar 文件

java - JLabel滚动文本

java - Java 中数据的表示/建模(类与实例变量)

java - 访问并创建 Swing GUI 元素树

java - MySQL: "error in your SQL syntax"的来源

java - jpanel 作为内部类

java - 如何让 Discord Bot 等待特定用户使用 JDA 发送消息?

java - 将两个面板彼此相邻对齐

Java JTable 列标题未显示 - JScrollPane?

java - 使用 JFileChooser 而不打开实际文件