3

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

4

4 回答 4

4

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

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

另一方面,您可以使用:

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

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

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

于 2009-12-21T20:37:39.293 回答
1

要删除标题栏,请使用

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);
        }
    }
});
于 2009-12-21T20:09:25.493 回答
1

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

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

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

于 2009-12-21T21:33:53.530 回答
-1

对于 JInternalFrames...

javax.swing.plaf.InternalFrameUI ifu= this.getUI();
((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null);
于 2009-12-21T20:31:40.270 回答