具有空布局的 JPanel 类不显示组件

2023-12-03

因此,我创建了一个“CustomPanel”类的对象,该对象创建一个带有 GridLayout 的 JPanel 和其中的标签,然后将其添加到我的 JFrame 中。它可以很好地显示标签“HELLO”,但是当我将 jpanel 的布局管理器更改为 (null) 时,它不会显示任何内容。我知道,我知道使用空布局是一种非常糟糕的做法,但我只想知道为什么它不显示组件。

主要类别:

import javax.swing.JFrame;

public class MainMenu extends javax.swing.JFrame{

    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Size the window.
        frame.setSize(500, 500);

        CustomPanel panel = new CustomPanel();

        frame.getContentPane().add(panel);

        frame.setVisible(true);
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

带有 GridLayout 的 CustomPanel 类(效果很好):

import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CustomPanel extends JPanel{

    public CustomPanel() {
        initUI();
    }

    public final void initUI() {

        // create the panel and set the layout
        JPanel main = new JPanel();
        main.setLayout(new GridLayout());

        // create the labels
        JLabel myLabel = new JLabel("HELLO");

        // add componets to panel
        main.add(myLabel);

        this.add(main);
    }
}

具有空布局的 CustomPanel 类(这不起作用):

import javax.swing.JLabel;
import javax.swing.JPanel;

public class CustomPanel extends JPanel{

    public CustomPanel() {
        initUI();
    }

    public final void initUI() {

        // create the panel and set the layout
        JPanel main = new JPanel();
        main.setLayout(null);

        // create the labels
        JLabel myLabel = new JLabel("HELLO");
        myLabel.setBounds(10, 10, myLabel.getPreferredSize().width, myLabel.getPreferredSize().height);

        // add componets to panel
        main.add(myLabel);

        this.add(main);
    }
}

jlabel 在 jpanel 内正确设置,因此它应该显示在 jframe 的左上角,但事实并非如此。 是什么原因造成的?我错过了什么?


问题是,当您不使用正确的布局管理器时,主 JPanel 的首选大小为 0,0,并且不会在其所在的容器内显示。保存主 JPanel 的 CustomPanel 使用 FlowLayout 并将使用其包含的组件的首选大小来帮助调整这些组件的大小和位置,但由于 main 没有布局,因此将 JLabel 添加到 main 不会增加首选大小,因为它应该是 - 另一个使用布局的原因,CustomPanel 会将 main 显示为一个无大小的点。您当然可以通过给 main 一个首选大小来解决这个问题main.setPreferredSize(...),但是这样你就会用一个拼凑来解决一个拼凑——这不好。另一种可能的解决方案是将 CustomPanel 的布局更改为其他可能扩展它所包含的主 JPanel 的布局,也许为 CustomPanel 提供一个 BorderLayout。在这种情况下,以默认方式将 main 添加到 CustomPanel 会将主 JPanel 放置到 BorderLayout.CENTER 位置,将其展开以填充 CustomPanel,并且可能会看到 JLabel。

当然,正确的解决方案是尽可能避免使用空布局。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有空布局的 JPanel 类不显示组件 的相关文章

随机推荐

  • 内存中、独立、断开连接的 ADO 记录集

    当我的表单加载时 我在数据表子表单上运行此代码 并且没有收到任何错误消息或代码中断 我的 debug print 显示记录集 rs 充满了 2131 条记录 就像它应该的那样 但我的表单显示单行带有 Name 在各个领域 我的控件上的控件源
  • 在Android中浏览并上传pdf或word文件

    private void getDocument Intent intent new Intent Intent ACTION GET CONTENT intent setType application msword applicatio
  • ASP.Net MVC4 将“创建视图”绑定到包含列表的模型

    你好 在互联网领域 我有一个有趣的难题要问你 如果该对象包含纯粹使用 MVC 视图 部分视图的其他对象的列表 是否可以绑定视图来创建对象 伙计 结果很复杂 就像 让我给你一个快速的代码示例来说明我的意思 Models public clas
  • mongodb是否会自动在嵌入文档的_id字段上创建索引?

    在 node js 项目上使用 mongodb 和 mongoose 我想知道是否必须在嵌入项目的 id 字段上确保索引 也就是说 我看到 mongodb 自动在集合的 id 字段上创建索引 它是否也对嵌入集合的 id 字段执行相同的操作
  • 使用反射在抽象类中创建实例

    是否可以使用反射在抽象祖先类中创建派生类的实例 可以说 abstract class Base public Base createInstance using reflection Class ctor c getConstructor
  • Google 日历 api(超出日历使用限制)

    我在我的 php 项目中使用 Google Calendar Api 每天在执行插入查询时都会收到 超出日历使用限制 消息 但删除和列表方法工作正常 这是我的插入功能 谁能帮我 function insertEvent start end
  • 使用复选框在 ReactJS 中保存表单值

    我使用反应钩子表单创建了一个表单组件 该组件由一组复选框和一个文本输入组成 当用户单击最后一个复选框时出现文本输入custom 这个的想法是 当用户单击时 会出现一个文本输入 并且用户可以添加自定义答案 选项 例如 如果用户输入test在输
  • Django:通过查询计算列值的总和

    我有一个模型 class ItemPrice models Model price models DecimalField max digits 8 decimal places 2 我尝试用这个来计算总和price在此查询集中 items
  • 两个卷积层之间的互连

    我有一个关于 CNN 中两个卷积层之间互连的问题 例如假设我有这样的架构 输入 28 28 conv1 3 x 3 滤波器 编号 过滤器数量 16 conv2 3 x 3 滤波器 编号 过滤器数量 32 假设图像尺寸没有减小 经过 conv
  • 值传递和 std::move 相对于引用传递的优点

    我现在正在学习C 尽量避免养成坏习惯 据我了解 clang tidy包含许多 最佳实践 我尝试尽可能地坚持它们 尽管我不一定理解why它们还被认为是好的 但我不确定我是否理解这里推荐的内容 我使用了教程中的此类 class Creature
  • 如何使用 Mongoose 删除数据库?

    我正在 Node js 和 Mongoose 中准备一个数据库创建脚本 如何检查数据库是否已存在 如果存在 则使用 Mongoose 删除 删除 它 我找不到用 Mongoose 删除它的方法 没有方法可以从猫鼬中删除集合 您能做的最好的事
  • Oracle 根据出生日期和今天计算年龄

    我想在 Oracle 函数中根据出生日期计算当前年龄 我正在使用的是 Today Dob 30 12 但这并不准确 因为有些月份有 31 天 我需要以最高精度获得正确的年龄 我怎样才能做到这一点 SQL gt select trunc mo
  • 带有附加列的sql批量插入

    csv 文件包含 8 列 col1 col2 col8 文件名也包含必须插入表中的日期 如果表中的列数和 csv 文件中的列数相等 则以下查询将文件中的所有记录导入到表中 query BULK INSERT real data FROM p
  • 如何从分类分布中抽取样本

    我有一个 3D numpy 数组 其中最后一个维度中包含每个类别的概率 就像是 import numpy as np from scipy special import softmax array np random normal size
  • 在控制台显示上对齐 printf() 列并防止溢出到下一行?

    printf processid t threadid t refilling t drinking t thinking t waiting t terminated t p type t required t consumed t wa
  • 如何在循环中追加多个 pandas DataFrame?

    我已经在这个 python 问题上苦苦挣扎了一段时间 但陷入了困境 我正在循环遍历多个 csv 文件 并希望有一个数据框以每个 csv 文件中的一列作为列名称并设置 date time 的公共索引的方式附加 csv 文件 有 11 个 cs
  • RoR 3 限制用户每天发帖 2 条

    我正在寻找方法限制我的用户每天发帖次数不超过两次 并且每周发帖次数不超过 5 个 我有一个用户和帖子模型 控制器 我一直在研究这些问题 但它们并不完全是我想要的 Rails 3 1 限制用户创建的对象 如何验证 Rails 中的时间 限制用
  • Fortran if 语句中的隐式转换整数 <--> 逻辑

    我有一些遗留的 Fortran 代码 我被要求分析它们并将其翻译成现代语言 我不知道过去使用哪个编译器来编译代码 所以现在我尝试使用 gfortran 来编译它 该代码包含这样的语句 导致 gfortran 抱怨 program test
  • 将元素形成 numpy 数组作为另外两个 numpy 数组时出现广播错误

    我正在尝试生成一个 numpy 数组 其元素作为另外两个 numpy 数组 如下所示 W1b1 np zeros 256 161 W2b2 np zeros 256 257 Wx np array W1b1 W2b2 dtype np ob
  • 具有空布局的 JPanel 类不显示组件

    因此 我创建了一个 CustomPanel 类的对象 该对象创建一个带有 GridLayout 的 JPanel 和其中的标签 然后将其添加到我的 JFrame 中 它可以很好地显示标签 HELLO 但是当我将 jpanel 的布局管理器更