【问题标题】:load JPanel that contains another JPanel加载包含另一个 JPanel 的 JPanel
【发布时间】:2015-05-03 04:41:29
【问题描述】:

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

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

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 不显示它。逻辑有什么问题?有什么问题?

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。

标签: java swing jpanel containers


【解决方案1】:

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

  1. 每个类都扩展并具有它所处理的组件的实例。
  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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2021-03-15
    相关资源
    最近更新 更多