使用 BorderLayout 将 JPanel 浮动在 JPanel 上方

2023-12-01

我有一个JPanel called pnlMain布局设置为BorderLayout。面板里面有三个JPanel添加到PAGE_START, CENTER, and PAGE_END。现在,我的要求是,如果单击“设置”按钮,它将显示一个透明的JPanel above pnlMain。然后,这个透明面板将包含一个不透明的、较小的居中面板,其中将包含设置内容。

我知道我可以使用JLayeredPane,但是看着tutorial它说你只能使用绝对定位来放置不同深度的组件,我知道这是非常不鼓励的。

有没有其他方法可以在不使用绝对定位的情况下做到这一点?


您可以使用父框架的玻璃窗格,这将允许您向其中添加组件,这些组件将显示为覆盖在主要内容上。

基本上,我会创建一个JPanel并将其设置为透明(setOpaque(false))。我会将其布局管理器设置为类似的GridBagLayout(因为它将使用子组件的首选大小并自动将其在其父容器中居中)。

然后我会在这个面板上添加Settings panel.

最后,我将父框架的玻璃窗格设置为第一个(背面)窗格并使其可见。

frame.getRootPane().setGlassPane(backingPane); // Or similar

看一眼如何使用根窗格

Updated

如果您自己无法使用顶层框架的玻璃板,那么您需要伪造它。

这个例子基本上使用了JLayeredPane由一个支持GridBagLayout

enter image description here

如果您添加一个MouseListener and KeyListener在后台窗格中,您可以使用发送到子组件的事件。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class FloatingPane {

    public static void main(String[] args) {
        new FloatingPane();
    }

    public FloatingPane() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final WorkPane workPane = new WorkPane();
                JButton settings = new JButton("Settings");
                settings.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        workPane.toggleSettings();
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(workPane);
                frame.add(settings, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class WorkPane extends JLayeredPane {
        private final BackingPane backingPane;

        public WorkPane() {

            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            add(createLabel("Center", Color.BLUE), gbc);

            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 0;
            gbc.weighty = 0;
            gbc.fill = GridBagConstraints.VERTICAL;
            add(createLabel("Left", Color.RED), gbc);
            gbc.gridx = 2;
            add(createLabel("Right", Color.GREEN), gbc);

            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.gridheight = GridBagConstraints.REMAINDER;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.BOTH;

            backingPane = new BackingPane();
            backingPane.add(new SettingsPane());
            backingPane.setVisible(false);
            add(backingPane, gbc);

            setLayer(backingPane, DEFAULT_LAYER + 1);

        }

        public void toggleSettings() {

            backingPane.setVisible(!backingPane.isVisible());

        }

        protected JLabel createLabel(String text, Color bg) {

            JLabel label = new JLabel(text);
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setOpaque(true);
            label.setBackground(bg);

            return label;

        }
    }

    public class BackingPane extends JPanel {

        public BackingPane() {
            setLayout(new GridBagLayout());
            setOpaque(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(new Color(128, 128, 128, 192));
            g.fillRect(0, 0, getWidth(), getHeight());
        }

    }

    public class SettingsPane extends JPanel {

        public SettingsPane() {

            setBorder(new EmptyBorder(10, 10, 10, 10));
            add(new JLabel("Settings"));

        }
    }
}

另一种解决方案可能是通过拍摄当前面板的快照并使用CardLayout,翻转到设置窗格,使用快照作为设置窗格的背景图像(然后可以应用灰度和模糊等效果)

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

使用 BorderLayout 将 JPanel 浮动在 JPanel 上方 的相关文章

  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 图像仅在 iPhone x 上拉伸

    我目前正在设计和构建一个 html 和 css 网站 遇到了一个小问题 我使用 chrome 开发工具检查了响应能力 根据手机和平板电脑的大小调整窗口大小 一切看起来都很好 然而 现在我在 iPhone X 上检查了该网站 图像全部垂直拉伸
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐

  • 如何在装配中比较两个浮点数

    我 在装配方面完全是新手 我想比较两个变量 浮点数 并正确跳转到正确的函数 这是一场乒乓球比赛 它是用 FASM 编写的 The right pad P0x dd 0 9 P0y dd 0 05 P1x dd 0 95 P1y dd 0 2
  • 使用提交按钮 AJAX 实时检查可用性

    测试1 php
  • 我们可以在Azure网站或虚拟机中运行windowservice或EXE吗?

    我有使用 Azure 上的云服务 托管服务的经验 然而 关于另一个项目 我对功能的选择感到困惑 我有一个项目 2层asp net应用程序 我需要运行windowservice或exe 它每天都会执行一些功能 如获取数据 所以我的困惑如下 关
  • 按列组合 CSV 文件

    假设我有两个 CSV 文件 名为A and B in Python A s head好像 headerNameA1 headerNameA2 1 12412424 1 1 1 1 1 1 1 B s head好像 headerNameB1
  • 调用 getExtra 时 Boolean 将自身重置为 false

    当我为 isDeleted 布尔值调用 getExtras getBoolean key 时 它不断将自身设置为 false 即使我传递的是 true 关于为什么会发生这种情况的任何见解 我尝试了很多其他方法 但没有成功地保持布尔值 TRU
  • 无法加载从笔尖引用的“my-icon.png”图像(iPhone)

    我收到以下错误消息 2011 02 11 14 47 13 815 myProject 13177 207 Could not load the icon troubleshoot png image referenced from a n
  • Tegra 3 设备上的 OpenGL 扩展

    我想知道新的 Tegra 3 设备上有哪些新的 OpenGL ES 扩展 有人愿意发布他们的设备名称 OpenGL 版本和扩展列表 仅限 Tegra 3 设备 吗 我认为其他开发人员也可以使用它 在 Android 上 您可以执行以下操作
  • JPanel 中的多个动画(线程)

    我正在尝试用 Java 编写棋盘游戏 我有 11 个类 包括主类 Board 类 扩展 JPanel 并绘制棋盘图像和骰子图像 Player 类扩展了 JCoponent 并实现了 Runnable Thread 每个玩家实例都是一个在棋盘
  • 使用 CarrierWave 和 Rails 设置 Froala WYSIWYG 编辑器

    我一直在努力让 Froala 充分利用我的 Rails 设置 我有一种类似博客的应用程序 其中包含与每个帖子相关的帖子和 图像 class Post lt ActiveRecord Base has many images accepts
  • 发现元素何时插入到 std::map

    我的程序正在将一些数据 地址 插入 使用 运算符 到 std map 中 我可以跟踪 137 个元素的插入 它们都插入了有效值 在某个阶段 我迭代地图并尝试对值 地址 进行一些操作 我在开始迭代地图之前设置了一个断点 当我在调试器中检查地图
  • 使用 NSScanner 查找短语的下一个匹配项

    我使用以下代码在 HTML 文件中查找特定代码行 NSURL requestTimetableURL NSURL URLWithString http www dhsb org index phtml d 201435 NSLog Load
  • 当我可以通过引用子类访问所有方法时,为什么还要引用基类呢?

    我正在学习java概念 我对java继承概念有疑问 在继承中 我们可以将子类实例分配给基类引用 这样我们就只能访问基类函数 我们可以将继承层次结构中的任何子类实例分配给基类引用 对于分配给特定基类引用的实例类型 我们只能访问基类函数 我没有
  • 通过手机浏览器检索 IMEI 号码/ SIM 号码/手机号码

    以下是场景 我有一个可通过移动浏览器访问的网络应用程序 每当用户单击可通过网络浏览器访问的应用程序页面中的链接时 我需要检测移动设备 IMEI 和 sim IMSI 这是为了跟踪具有相同 SIM 卡的同一设备并为他 她提供下一级访问权限 无
  • 使用 C# 和 COM 提取 InDesign CS4 图形

    我正在尝试获取 InDesign 文件中图形的详细信息 出于技术原因 我使用 COM 不是我最喜欢的 因为 在 StackOverflow 的其他地方讨论过 你必须花半生的时间来选角 理论上 下面的代码片段应该可以工作 智能感知显示AllG
  • 获取有关操作系统的详细信息

    我认为这很容易 但我无法弄清楚 如何判断使用的是Win7还是WinXP 比如操作系统的详细信息 Linux 应该给出具体信息 Mac 操作系统版本等 我想从中读取用户代理Services appShell hiddenDOMWindow a
  • 如何使用 PHP 检索页面源代码(在 javascript 运行之后)?

    在我的页面上 javascript在页面加载时添加了很多类 取决于页面 我怎样才能等到 javascript 添加这些类 然后使用 Javascript 或 PHP 从不同的文件获取 HTML 当页面加载完成后 使用 Ajax 将渲染的源代
  • 如何删除列表中其字符串包含另一个列表中的子字符串的元素

    我有一个像这样的字符串 var str DAVID CORPORATION 然后我在 str 中有一个我不想要的子字符串列表 var describers new List
  • Vbscript - 读取 ini 或文本文件的特定部分

    我想将一些地址存储在文本文件中 然后根据组成员身份读取文件的特定部分 我已经完成了所有小组成员资格的工作 所以我不需要任何帮助 但我不确定是否应该使用纯文本文件或 INI 文件 问题是 帖子地址分为两行或三行 我需要换行 我尝试使用纯文本文
  • 参数末尾的“&”运算符

    我是菜鸟 这是我的第一篇文章 关于 字符 我理解它作为引用 地址和逻辑运算符的一般用法 然而 当我试图让 boost 随机数生成器函数工作时 我注意到我以前从未见过的 字符的另一种用法 也没有关于它的明确文档 至少在网络上 请注意 下面的
  • 使用 BorderLayout 将 JPanel 浮动在 JPanel 上方

    我有一个JPanel called pnlMain布局设置为BorderLayout 面板里面有三个JPanel添加到PAGE START CENTER and PAGE END 现在 我的要求是 如果单击 设置 按钮 它将显示一个透明的J