JPanel 不会完全伸展以占据可用空间

2024-02-19

我有一个面板,我在其中并排放置了几个具有不同尺寸和颜色的迷你面板,它们应该占据整个父面板(​​水平)。

为此,我使用 BorderLayout(用于父面板),并使用 BoxLayout 作为放置所有迷你面板的子面板(请参见下面的代码)。它在调整大小和其他一切时确实可以正常工作并表现正常。然而,随着迷你面板数量的增加,会出现一种奇怪的行为:父面板的末尾出现空白区域。

我想我发现这是布局管理器中的一个拉伸错误,因为为了拉伸面板,布局管理器尝试向每个迷你面板添加一个像素。然而,当迷你面板的数量很大时,向每个迷你面板添加一个像素将导致添加许多像素并超出父面板的大小。因此,布局管理器最终不会向任何迷你面板添加任何像素,从而导致空白空间。

这是我的 SSCE: (尝试运行并拉伸窗口,以了解问题)

package com.myPackage;

import java.awt.*;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ColoredPanels extends JPanel
{
    /* Content information. */
    private Vector<Integer> partitions;
    private Vector<Color> colors;

    /* Panel where the content panels will go. */
    private JPanel contentHolder;

    private final int defaultHeight = 20;

    public ColoredPanels(Vector<Integer> partitions, Vector<Color> colors)
    {
        assert partitions != null;
        assert !partitions.isEmpty();
        assert colors != null;
        assert !colors.isEmpty();
        assert colors.size() == partitions.size();

        this.partitions = partitions;
        this.colors = colors;

        /* Set layout manager. */
        setLayout(new BorderLayout());

        /* Create the content holder. */
        contentHolder = new JPanel();
        contentHolder.setLayout(new BoxLayout(contentHolder, BoxLayout.X_AXIS));
        this.add(contentHolder, BorderLayout.NORTH);

        /* Fill content holder with colored panels. */
        createPanels();
    }

    private void createPanels()
    {
        assert partitions != null;
        assert !partitions.isEmpty();
        assert colors != null;
        assert !colors.isEmpty();
        assert colors.size() == partitions.size();

        for (int i = 0; i < partitions.size(); i++)
        {
            JPanel newPanel = new JPanel();
            newPanel.setBackground(colors.get(i));
            newPanel.setPreferredSize(new Dimension(partitions.get(i), defaultHeight));
            newPanel.setMinimumSize(new Dimension(1, defaultHeight));
            contentHolder.add(newPanel);
        }
    }

    public static void main(String[] in)
    {
        Vector<Integer> sizes = new Vector<Integer>();
        Vector<Color> cols = new Vector<Color>();

        /* Make 100 random sizes, and use two colors. */
        for (int i = 0; i < 100; i++)
        {
            int size = (int)Math.round(1 + Math.random() * 10);
            sizes.add(size);
            cols.add((i%2 == 0)? Color.red : Color.green);
        }

        ColoredPanels panels = new ColoredPanels(sizes, cols);
        panels.setBorder(BorderFactory.createLineBorder(Color.yellow, 1));

        JFrame newFrame = new JFrame();
        newFrame.getContentPane().add(panels);
        newFrame.pack();
        newFrame.setVisible(true);
    }
}

我该如何避免这种行为?我希望我的面板占据整个容器。

EDIT:迷你面板旨在具有(一旦解决)鼠标侦听器。不幸的是,这种涂漆解决方案是可以避免的。


布局问题可以通过... LayoutManagers 解决:-) 如果没有达到您想要的效果,请实现您想要的行为。

因此,如果核心 BoxLayout 只是由于舍入错误而忽略像素,请子类化并使其根据需要分配这些像素。一个非常原始的快速示例:

public static class XBoxLayout extends BoxLayout {

    enum Strategy {
        NONE,
        STRETCH_LAST,
        DISTRUBUTE
    }

    private Strategy strategy;

    public XBoxLayout(Container target, int axis, Strategy strategy) {
        super(target, axis);
        this.strategy = strategy;
    }


    @Override
    public void layoutContainer(Container target) {
        super.layoutContainer(target);
        if (Strategy.NONE == strategy) return;
        Insets targetInsets = target.getInsets();
        int targetSize = target.getWidth() - targetInsets.left - targetInsets.right;
        int childSum = 0;
        for (Component child : target.getComponents()) {
            childSum += child.getWidth();
        }
        if (targetSize > childSum) {
            int excess = targetSize - childSum;
            distribute(target, excess);
        }
    }


    private void distribute(Container target, int excess) {
        System.out.println("childCount/rounding excess " + target.getComponentCount() + "/" + excess);
        if (Strategy.STRETCH_LAST == strategy) {
            Component lastChild = target.getComponent(target
                    .getComponentCount() - 1);
            lastChild.setSize(lastChild.getWidth() + excess,
                    lastChild.getHeight());
        } else {
            int firstToDistribute = target.getComponentCount() - excess;
            int summedOffset = 0;
            for(int index = firstToDistribute; index < target.getComponentCount(); index++) {
                Component child = target.getComponent(index);
                Rectangle bounds = child.getBounds();
                bounds.x += summedOffset++;
                bounds.width += 1;
                child.setBounds(bounds);
            }
        }
    }

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

JPanel 不会完全伸展以占据可用空间 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 如何使用不同元素的事件监听器管理不同的事件?

    document ready function var player 1 listener myVid 1 0 f player 1 listener addEvent ready ready var player 2 listener m
  • 如何在内存中保存位图

    跟进将位图资源存储在静态变量中 https stackoverflow com questions 8814455 storing a bitmap resource in a static variable 似乎存储一个静态引用andro
  • 更新查询结果错误

    我有一个名为company emp 在该表中 我有 6 列与员工相关 empid ename dob doj 我还有另一张桌子叫bday 我只有 2 列 恩皮德和多布 我有这样的疑问 select empid dob from compan
  • 显示带有故事板的一次性登录屏幕的最佳实践

    我在这里看到过类似的问题 但没有明确的答案 因此 我有一个模式登录视图 其中包含经典的用户名 密码表单 Facebook 登录按钮和注册按钮 我希望在用户第一次启动应用程序时显示这些按钮 据我发现 有两种方法可以实现这一点 但都有缺点 在
  • 命令字符串中带有 & 符号的 PowerShell Invoke-Expression

    我试图将带有包含 符号的字符串的变量传递到 Invoke Expression 中 它告诉我必须将其放在引号中并将其作为字符串传递 我尝试了转义和使用原始字符串以及变量中的字符串与 和 组合的多种组合 但均无济于事 我该怎么做 这是代码 s
  • 在 Chrome 中使用 JavaScript 将音频录制为 .wav

    我正在构建一个网页 用于记录用户设备中的音频 并将其发送到 Microsoft 的认知语音服务以进行语音到文本的转换 到目前为止 我已经能够创建和播放用 JavaScript 制作的 ogg 文件 但我需要获取 wav 格式的文件 斑点类型
  • Google Chrome 用户脚本参考 window.open

    我已经尝试解决这个问题有一段时间了 但是当我尝试引用我打开的窗口时 句柄始终是未定义的 值得注意的是 这被用于用户脚本这是有问题的片段 var donateWindow Show the donation popup and open a
  • 应用程序运行时,LogCat 充满“input svInfo.flags is 8”

    当我在 Android Studio 中运行几乎所有应用程序时 我的LogCat https developer android com studio debug am logcat充满了诸如以下的消息 E GnssHAL GnssInte
  • 计算 pandas 数据框中每月每个项目的出现次数

    Date Items Location 2022 01 01 Item1 Location1 2022 01 01 Item2 Location1 2022 01 02 Item1 Location3 2022 01 03 Item3 Lo
  • 如何从 C# 控制台应用程序中的目录获取路径?

    假设我有这个文件结构 解决方案 gt 文件夹1 gt FileIwant html 所以这可能类似于 C Soultion Folder1 FilterIwant html 现在我需要将该文件读入我的应用程序 我不能只是硬编码它 因为当我把
  • 从用户那里获取日期/时间输入的最佳方法是什么?

    这是一个多年来被一次又一次重新发明的轮子 问题 用户需要输入日期 时间 基本考虑因素 我们希望让用户尽可能轻松地输入所需的日期 时间 有些应用程序要求历史日期 有些应用程序仅要求未来日期 有些应用程序需要处理两者 我们希望防止用户输入乱码数
  • Cookie 与 jsessionid url 令牌优先级

    怎么样Set Cookie VS jsessionid url token优先 如果设置了 cookie Apache Tomcat 似乎会忽略令牌 这样的行为是不是有点不方便呢 还是因为安全原因才这样 这是 servlet 中请求的 ur
  • 还可以发布 Gmail 插件吗?

    I ve been trying to publish a Gmail add on for half a year now But I can t submit it because the required option is disa
  • Spring + Tomcat 基于Request URL的多租户

    我们有一个可供多个客户使用的单一应用程序 每次都是同一个应用程序 但使用不同的数据库 我们当前的设置包括 Apache 2 网络服务器 Tomcat 8 春季4 1 Web 服务器将特定的 URL 路由到 Tomcat 即 customer
  • PrimeFaces:如何覆盖 CSS 类

    创建按钮时 该类ui corner all始终适用 我尝试了以下方法
  • Rail 3.2.2/Devise:带有 rspec 的弃用警告

    我最近将一个应用程序升级到了 Rails 3 2 2 我正在使用 Factory girl Factory sequence name do n 名称 n 结束 Factory define 用户做 u u first name Facto
  • 詹金斯:无法连接到存储库

    我正在尝试在 github 存储库上连接 jenkins 当我指定 Repo URL 时 jenkins 返回以下错误消息 无法连接到存储库 命令 git ls remote h 电子邮件受保护 cdn cgi l email protec
  • 从 JavaScript 正确调用 TypeScript 代码

    在我们的大型企业项目中 我们面临的情况似乎在互联网上的文章和帖子中没有得到很好的描述 我们需要将支持 SPA 的现有 JavaScript 基础设施代码与其他团队在 TypeScript 上开发的代码集成起来 由于许多政治限制和可用的开发资
  • 如何在 JSON 对象中添加 URL 字符串

    我需要添加通常采用 http somewebsite com somepage asp 格式的 URL 当我使用上面的 URL 创建一个字符串并将其添加到 JSON 对象 json 时 using json put url urlstrin
  • JPanel 不会完全伸展以占据可用空间

    我有一个面板 我在其中并排放置了几个具有不同尺寸和颜色的迷你面板 它们应该占据整个父面板 水平 为此 我使用 BorderLayout 用于父面板 并使用 BoxLayout 作为放置所有迷你面板的子面板 请参见下面的代码 它在调整大小和其