java - 我的扩展 JPanel 的父级为 null

标签 java swing null jpanel parent

我有一个扩展的 JPanel 类,它创建一个 JPanel 并将其添加到其父级。 从父级调用的 getComponents 正确显示面板,但从扩展实例调用的 getParent 返回 null.layeredPane

package testing;

import javax.swing.JButton;

public class ParentNullExample extends javax.swing.JFrame {

private static Panel1 mainPanel;
private static JButton AddButton;

private void createAndShowGUI() {
    //Set the look and feel.
    initLookAndFeel();

    setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);

    AddButton = new javax.swing.JButton();
    AddButton.setName("AddButton");
    AddButton.setText("Add a Row");
    AddButton.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            addRowActionPerformed(evt);
        }
    });

    Panel1 componentPanel = new Panel1(true);
    componentPanel.setName("componentPanel");

    mainPanel = new testing.Panel1(false);
    mainPanel.setName("mainPanel");

    mainPanel.add(componentPanel);
    mainPanel.add(AddButton);

    mainPanel.setOpaque(true);
    setContentPane(mainPanel);

    pack();
    DebugUtils.analyseFrame(this);
}

private void addRowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addRowActionPerformed
    mainPanel.revalidate();
}//GEN-LAST:event_addRowActionPerformed

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new ParentNullExample().setVisible(true);
        }
    });
}
}
<小时/>
package testing;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import static javax.swing.BoxLayout.Y_AXIS;
import javax.swing.JPanel;

public class Panel1 extends JPanel {

    private JPanel mainPanel;
    private Dimension preferredSize;
    private GridLayout tableGridLayout = new GridLayout(0,1);
    private Boolean isGridLayout;

    public Panel1(Boolean gridLayout) {
        isGridLayout = gridLayout;
        mainPanel = new JPanel();
        if (gridLayout) {
            super.setLayout(tableGridLayout);
        }
        else {
            BoxLayout boxLayout = new BoxLayout(this,Y_AXIS);
            super.setLayout(boxLayout);
        }
        preferredSize = new Dimension();
    }

    @Override
    public void revalidate() {
        if (preferredSize == null) preferredSize = new Dimension();
        Component superParent = super.getParent();
        String superParentName = (superParent == null ? "null" : superParent.getName()) ;
        Component thisParent = this.getParent();
        String thisParentName = (thisParent == null ? "null" : thisParent.getName()) ;

        System.out.print("revalidate: "+
            "Name: "+this.getName()+", "+
            "super.Parent: "+superParentName+", "+
            "this.Parent: "+thisParentName+", "+
            "preferredSize: ["+preferredSize.getHeight() +", "+
            preferredSize.getWidth()+"]\n");

        if (superParent != null) superParent.revalidate();
        if (thisParent != null) thisParent.revalidate();
    };

    @Override
    public Dimension getPreferredSize() {
        return preferredSize;
    };

    @Override
    public Dimension getMaximumSize() {
        return new Dimension((int) super.getMaximumSize().getWidth(), (int) preferredSize.getHeight());
    };

    @Override
    public Component add(Component c) {
        super.add(c);
        preferredSize.setSize(addComponentSize(c, preferredSize));
        tableGridLayout.layoutContainer(mainPanel);
        return null;
    }

    public static Dimension addComponentSize(Component c, Dimension sizeSoFar) {
        int componentWidth = (int) c.getPreferredSize().getWidth();
        int panelWidth = (int) sizeSoFar.getWidth();
        int width = (panelWidth > componentWidth) ? panelWidth : componentWidth;
        int height = (int) (c.getPreferredSize().getHeight() + sizeSoFar.getHeight());
        return new Dimension(width, height);
    }

}

输出将父名称显示为“null.layeredPane”,这不是预期的名称。

revalidate: Name: null, super.Parent: null, this.Parent: null, preferredSize: [0.0, 0.0]
revalidate: Name: null, super.Parent: null, this.Parent: null, preferredSize: [0.0, 0.0]
revalidate: Name: null, super.Parent: null, this.Parent: null, preferredSize: [0.0, 0.0]
revalidate: Name: null, super.Parent: null, this.Parent: null, preferredSize: [0.0, 0.0]
1- Frame: Class: testing.ParentNullExample, Name: frame0, H: 61, W: 132
2|- Container: Name: mainPanel, Class: testing.Panel1, Layout: javax.swing.BoxLayout, H: 23, W: 116
3|-- Component: Class: testing.Panel1, Name: componentPanel, H: 0, W: 116
3|-- Component: Class: javax.swing.JButton, Name: AddButton, H: 23, W: 85


revalidate: Name: mainPanel, super.Parent: null.layeredPane, this.Parent: null.layeredPane, preferredSize: [23.0, 85.0]
revalidate: Name: mainPanel, super.Parent: null.layeredPane, this.Parent: null.layeredPane, preferredSize: [23.0, 85.0]

最佳答案

所以,基本上,您似乎对 API 存在误解。 JFrameJRootPane 组成,其中包含 JLayeredPane,其中包含 contentPane JMenuBarglassPane,如下...

RootPane

因此,当使用 setContentPane(mainPanel); 时,您将 mainPanel 添加到 JLayeredPane

参见How to use root panes了解更多详情

关于java - 我的扩展 JPanel 的父级为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43578523/

相关文章:

java - 我们应该如何为空值管理 jdk8 流

java - 解析 JSON 对象时 Gson 解析错误

java - 为什么 Applet 的继承类没有必要重写其所有方法,因为 Applet 类是抽象类

java - 为什么不必处理 `java.lang` 包中的类可能抛出的异常?

java - 准备好的语句是否在这里防止 SQL 注入(inject)

java - 移动框架的鼠标事件不起作用

java - 这些花括号有什么作用?

c# - 使用C#删除excel中的空行

java - 重置 ContentPane 时,按钮功能不再正常工作 Java swing

java.lang.NullPointerException - 找不到 null 变量