如何移动放置在容器底部的最小化组件?

2023-12-01

我的容器中有三个组件,其中有按钮。当我点击最小化按钮时,组件会最小化到容器的底部,当我点击最小化组件时,它会最大化。

假设三个组件位于底部,如果我最大化第二个组件,那么它就会最大化,而第三个最小化组件不会占据第二个组件的位置,并且这仍然是空间。

Screenshot
enter image description here

package Project;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import javax.swing.plaf.basic.BasicInternalFrameUI;

public class Test2 {

    public Test2() throws HeadlessException, PropertyVetoException {
        createAndShowGUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new Test2();
                } catch (HeadlessException ex) {
                    ex.printStackTrace();
                } catch (PropertyVetoException ex) {
                    ex.printStackTrace();
                }

            }
        });
    }

    private void createAndShowGUI() throws HeadlessException, PropertyVetoException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final JDesktopPane jdp = new JDesktopPane() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(600, 400);
            }
        };

        frame.setContentPane(jdp);
        frame.pack();

        createAndAddInternalFrame(jdp, 0, 0);
        createAndAddInternalFrame(jdp, 300, 0);
        createAndAddInternalFrame(jdp, 1, 200);

        frame.setVisible(true);
    }

    private void createAndAddInternalFrame(final JDesktopPane jdp, int x, int y) throws PropertyVetoException {
        final JInternalFrame jInternalFrame = new JInternalFrame("", true, true, true, true);
        jInternalFrame.setLocation(x, y);

        JPanel jp = new JPanel();
        JLabel jl=new JLabel("panel"+x);

        JButton jb = new JButton("_");
        JButton jb2 = new JButton("[]");
        JButton jb3 = new JButton("X");

        jInternalFrame.setLayout(new GridLayout(2, 2));
jp.add(jl);
        jp.add(jb);
        jp.add(jb2);
        jp.add(jb3);

        jInternalFrame.add(jp);

        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    if (jInternalFrame.getLayer() == JDesktopPane.FRAME_CONTENT_LAYER) {
                        jdp.remove(jInternalFrame);
                        jdp.add(jInternalFrame, JDesktopPane.DEFAULT_LAYER);
                        jdp.revalidate();
                        jdp.repaint();
                    }
                    jInternalFrame.pack();
                    jInternalFrame.setIcon(true);
                } catch (PropertyVetoException ex) {
                    ex.printStackTrace();
                }

            }
        });
        jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    if (jInternalFrame.isMaximum()) {//restore
                        jInternalFrame.pack();
                    } else {//maximize
                        jInternalFrame.setMaximum(true);
                    }
                    jdp.remove(jInternalFrame);
                    jdp.add(jInternalFrame, JDesktopPane.FRAME_CONTENT_LAYER);
                    jdp.revalidate();
                    jdp.repaint();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });
        jb3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    jInternalFrame.dispose();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

            }
        });

        BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
        jInternalFrame.remove(titlePane);

        jInternalFrame.pack();
        jInternalFrame.setVisible(true);
        jdp.repaint();

        jdp.add(jInternalFrame);
    }
}

我已经使用 Metal 和 Windows L&F 对此进行了测试,您可能需要使用其他一些工具进行测试。

基本上,当组件失效并且doLayout方法被调用时,我们检查是否存在任何JInternalFrame.JDesktopIcon成分。然后我们把它们拿出来并按照我们喜欢的方式布局......

public class TestInternalFrame {

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

    private int xpos = 0;
    private int ypos = 0;

    public TestInternalFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception exp) {
                    exp.printStackTrace();
                }
                DesktopPane pane = new DesktopPane();
                pane.add(newInternalFrame());
                pane.add(newInternalFrame());
                pane.add(newInternalFrame());

                JFrame frame = new JFrame();
                frame.add(pane);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    public JInternalFrame newInternalFrame() {
        JInternalFrame inf = new JInternalFrame("Blah", true, true, true, true);
        inf.setLocation(xpos, ypos);
        inf.setSize(100, 100);
        inf.setVisible(true);

        xpos += 50;
        ypos += 50;

        return inf;
    }

    public class DesktopPane extends JDesktopPane {

        @Override
        public void doLayout() {
            super.doLayout();
            List<Component> icons = new ArrayList<Component>(25);
            for (Component comp : getComponents()) {
                if (comp instanceof JInternalFrame.JDesktopIcon) {
                    icons.add(comp);
                }
            }

            int x = 0;
            for (Component icon : icons) {

                int y = getHeight() - icon.getHeight();
                icon.setLocation(x, y);
                x += icon.getWidth();

            }
        }
    }
}

别误会,这是一个粗暴的黑客攻击

Updated

int x = 0;
for (Component icon : icons) {
    int y = getHeight() - icon.getHeight();
    icon.setLocation(x, y);
    x += icon.getWidth();
    setLayer(icon, 10); // <--- Add me
}

对于您的另一个问题,您只需将图标移动到更高的层即可。问题是你实际上需要找到一个足够高的层。你可以使用Integer.MAX_VALUE,但这有点苛刻(你可能想要在上面的东西),相反,你可以计算最大层并在上面+1......

public void doLayout() {
    super.doLayout();
    List<Component> icons = new ArrayList<Component>(25);
    int maxLayer = 0;
    for (Component comp : getComponents()) {
        if (comp instanceof JInternalFrame.JDesktopIcon) {
            icons.add(comp);
            maxLayer = Math.max(getLayer(comp), maxLayer);
        }
    }

    maxLayer++;
    int x = 0;
    for (Component icon : icons) {

        int y = getHeight() - icon.getHeight();
        icon.setLocation(x, y);
        x += icon.getWidth();
        setLayer(icon, maxLayer);

    }
}

你真的需要花时间学习如何使用内部框架 and 如何使用分层窗格因为(至少最后一部分)包含在这些......

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

如何移动放置在容器底部的最小化组件? 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • 更改哪些键或字符触发 vscode 自动完成[重复]

    这个问题在这里已经有答案了 我是 VSCode 的新手 到目前为止很喜欢它 但我在更改智能感知自动完成触发器时遇到问题 在 javascript 文件中 输入 句点 点 或 括号 自动完成建议 我觉得这非常烦人 我想仅在选项卡上触发自动完成
  • UINavigationBar自定义背景问题

    我已成功使用以下方法将自定义背景添加到导航栏 UIImageView iv UIImageView alloc initWithImage UIImage imageNamed UINavigationBar png myViewContr
  • 在 $.ajax 成功方法中拒绝 jQuery Promise

    这可能是一个愚蠢的错误 但就是这样 我需要在 ajax 调用的 success 函数中拒绝 jQuery Promise 返回值 success 是一个布尔值 function doSomething var myPromise ajax
  • 在java中计算比int和long更大的阶乘?

    在这里和谷歌搜索了几天 并询问了我的编程朋友 不幸的是 我仍然不明白如何更改我的代码 我的程序计算给定数字的阶乘 然后它提供一个数字 表示阶乘答案包含多少位数字 然后将这些数字的值相加得出总数 我的程序适用于 1 之间的任何数字 和 31
  • MySQL 删除具有相同列值的重复行

    我正在进行一些数据清理 我想通过查找具有相同 图片 ID 和 日期 值的记录来删除重复行 Example picture id 2 date 13 Jul 18 picture id 2 date 13 Jul 18 picture id
  • Linq to SQL - “此成员被定义多次”错误

    我有以下 linq 代码 CMSDataContext dc new CMSDataContext var q from u in dc CMSUsers join d in dc tblDistricts on u DistrictCod
  • 使用 Unity 的 Visual Studio 安装问题

    因此 我尝试加载 Visual Studio 来编写一些用于鼠标移动的代码 但出现以下错误 此 Visual Studio 安装的设置尚未完成 请再次运行 Visual Studio 安装程序 我已经尝试安装所有内容 但它不起作用 我在互联
  • 在 C# 中对 TreeViewItems 列表进行数字排序

    这个问题是后续问题this问题 我目前的总体目标是添加到我的程序中TreeViewItem my TreeViewItem有在运行时添加的子节点 根据输入的值按数字升序排列header 我收到了一个答案ModelView 一个我不太熟悉的工
  • iText 5:创建包含 2 种背景颜色且文本重叠的 PdfPcell

    在 java 中使用 iText5 并希望对 PdfPcell 的结果进行颜色编码 如下所示 例如 该表包括2列和3行 有人知道如何实现这一目标吗 我可以简单地使用设置背景颜色吗 PdfPCell cell new PdfPCell new
  • 如何使用exceljs将excelsheet行高设置为auto,以便内容可以自动适应单元格

    我在用exceljsnpm 将数据导出到 Excelsheet 中 由于单元格中的内容很大 因此我希望文本包含在单元格中 并且应该有足够的高度来显示完整内容 我尝试给出固定宽度 worksheet getRow 1 height 20 固定
  • 将子字符串与字符串匹配

    我在将子字符串与字符串匹配时遇到问题 我的子字符串和字符串是这样的 var str My name is foo I have bag s var substr I have bag s 现在当我使用字符串匹配 子字符串 它返回 null
  • MAC OS:警告:项目错误:QT 中的未知模块:webkitwidgets

    我正在尝试构建 notepadqqMacOS遵循官方文档 运行 make 命令时我面临以下问题 make cd src ui test e Makefile usr local Cellar qt 6 3 0 bin qmake o Mak
  • 如何清除Flutter的Build缓存?

    flutter 的构建似乎有问题 我总是需要表现RUN gt 颤振全面重启每次我在模拟器或设备上运行应用程序时 否则 应用程序会加载一个脚手架主体 这是我两周前第一次开始编码时的代码 这是pastebin上的当前来源 children
  • 使用 < 重定向命令输入

    输入重定向适用于 exe 文件或内部 Windows 命令 app exe lt ListOfNames txt sort lt input txt 但是 当我尝试将其重定向到批处理脚本时 它不起作用 测试 bat echo off ech
  • 批处理文件运行时 cmd 中出现奇怪的输出

    我在批处理文件中有该脚本 cd C TESTS front tests call git pull cd C TEST front tests AutoApp bin debug start AutoApp exe And git pull
  • 使用rhandsontable R包生成的表时如何实现shinyStore?

    我正在尝试实现帖子中答案中的 保存 功能如何在 R Shiny 中使用 DT 的 localStorage 选项 进入我用 rhandsontable 渲染的表 但它不起作用 那篇文章涉及表包 DT 而我正在使用 rhandsontable
  • 如何用数学方法缩短网址

    我正在研究使用算法缩短 加密长度为 150 到 250 个字符到最多 12 个字符的 url 的可能性 最初我怀疑这是否可能 但我想利用 StackOverflow 的伟大思想 该算法应该是可以用经典的 asp sql c vb foxpr
  • 如何在android模拟器中运行特定的活动?

    我已经在 Eclipse 中创建了 4 个活动 现在我想在模拟器中分别一一运行活动 1 2 3 4 进行测试 谁能指导我如何运行所有这些 当我按下运行按钮时 它只运行第一个活动 任何帮助 将不胜感激 您可以尝试 startActivityF
  • 无法从 BASH 中的 WHILE 中获取变量的值

    我有一个代码 od An t x1 lt file while read line do for char in line do if needspace eq 0 then export hexs hexs printf 2s char
  • 如何移动放置在容器底部的最小化组件?

    我的容器中有三个组件 其中有按钮 当我点击最小化按钮时 组件会最小化到容器的底部 当我点击最小化组件时 它会最大化 假设三个组件位于底部 如果我最大化第二个组件 那么它就会最大化 而第三个最小化组件不会占据第二个组件的位置 并且这仍然是空间