【问题标题】:How could I implement new JFrame functionality我如何实现新的 JFrame 功能
【发布时间】:2009-12-21 19:59:52
【问题描述】:

我正在尝试移除 JFrame 顶部的拖动条。我想保持此栏上显示的最小化最大化和关闭选项可用。我在想的是删除栏(和图标)。然后将图标添加为嵌入图像,实现 JFrame actionlistener。这也需要与 JInternalFrames 一起使用。任何帮助将不胜感激。

【问题讨论】:

  • 将拖动功能提取到另一个问题中可能是个好主意。这让其他人更容易回答。并且它会让有相同问题的其他人更容易找到问题。

标签: java swing jframe


【解决方案1】:

您需要退后一步,了解 Swing 的工作原理。

当您创建 JFrame 时,Swing 使用 OS 小部件作为框架。您看到的标题栏是操作系统组件的一部分,您无法使用 Swing 直接控制它。如前所述,您可以使用 setUndecorated(false) 隐藏框架的标题栏(和边框)。在这种情况下,您失去了与标题栏(拖动和访问所有按钮)和边框(调整大小)相关的所有功能。因此,如果您需要其中的任何功能,您需要自己重新创建它。

另一方面,您可以使用:

JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();

Swing 将为您构建标题栏和边框,并添加回所有默认功能。因此,如果您想防止拖动,您现在需要检查 JFrame 的所有组件以找到代表标题栏的组件。当您找到此组件时,您可以从组件中删除 MouseMotionListeners 以防止拖动。这样标题栏仍然存在并且按钮将处于活动状态,但拖动将被禁用。我猜想将所有功能添加到未装饰的框架中会更容易。

您已经意识到 JInternalFrame 是一个完全用 Swing 编写的组件,因此您可以访问子组件,这本质上也是我为 JFrame 建议的方法。

【讨论】:

  • 哇,这是迄今为止我收到的最全面的答案之一!我真的很感激,让我试一试,然后回复你
【解决方案2】:

要删除标题栏,请使用

setUndecorated(true);

然后您可以重新添加最大化/最小化按钮。最大化按钮的来源可能看起来像这样(只是为了得到一个想法)。使用JFrame.ICONIFIED 作为最小化按钮。

JButton btnMaximize = new JButton("+");
btnMaximize.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(MainFrame.this.getExtendedState() == JFrame.MAXIMIZED_BOTH) {
            MainFrame.this.setExtendedState(JFrame.NORMAL);
        }
        else {
            MainFrame.this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        }
    }
});

【讨论】:

  • setUndecorated 不适用于 JInternalFrames(奇怪的是我以为他们继承了 JFrames)
  • 我会试一试,但请考虑编辑您关于 JInternalFrames 的问题。
  • JFrame 不是 JInternalFrame 的父类... JFrame 是具有原生对等体的顶级类。 JInternalFrames 是纯粹的 Swing 组件,必须存在于 JDesktopPane 中。
【解决方案3】:

看看这篇文章 - 我认为 JFrame 部分几乎就是你所需要的。

http://www.stupidjavatricks.com/?p=4

它基于JDialog,但它应该与JFrame几乎相同。最大化/最小化应该与关闭按钮几乎相同。

【讨论】:

    【解决方案4】:

    对于 JInternalFrames...

    javax.swing.plaf.InternalFrameUI ifu= this.getUI();
    ((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null);
    

    【讨论】:

    • 为什么投反对票?我是stackoverflow的新手,在其他论坛上发布代码是不是很糟糕?
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2014-04-16
    • 2022-11-02
    • 2011-02-26
    • 2021-03-21
    • 2019-08-07
    • 2018-05-23
    相关资源
    最近更新 更多