使用 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 上方 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

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

    我 在装配方面完全是新手 我想比较两个变量 浮点数 并正确跳转到正确的函数 这是一场乒乓球比赛 它是用 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