Java 如何实现新的JFrame功能

Java 如何实现新的JFrame功能,java,swing,jframe,Java,Swing,Jframe,我正试图移除JFrame顶部的拖拽条。我想保持此栏上显示的最小化最大化和关闭选项可用。我当时的想法是删除该条(和图标)。然后将图标添加为嵌入式图像,以实现JFrame actionlistener。这也有必要与JInternalFrames合作。非常感谢您的帮助。要删除标题栏,请使用 setUndecorated(true); 然后可以重新添加最大化/最小化按钮。“最大化”按钮的源代码可能类似于此(只是为了获得一个想法)。使用JFrame.ICONIFIED最小化按钮 JButton btnM

我正试图移除JFrame顶部的拖拽条。我想保持此栏上显示的最小化最大化和关闭选项可用。我当时的想法是删除该条(和图标)。然后将图标添加为嵌入式图像,以实现JFrame actionlistener。这也有必要与JInternalFrames合作。非常感谢您的帮助。

要删除标题栏,请使用

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);
        }
    }
});
对于JInternalFrames

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

您需要后退一步,了解Swing是如何工作的

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

另一方面,您可以使用:

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


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

看看这篇文章,我认为这正是JFrame部分所需要的


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

最好将拖动功能提取到另一个问题中。这使得其他人更容易回答。这将使其他具有相同问题的人更容易找到问题。StunNavigt对JInternalFrames不起作用(奇怪的是我认为他们继承了JFrand)。我会尝试一下,但是考虑编辑关于JInternalFrames.JFrame的问题不是JiTalnFrand的父类。JFrame是一个具有本机对等的顶级类。JinternalFrame是纯Swing组件,必须存在于JDesktopPane中。哇,这是迄今为止我收到的最全面的答案之一!我真的很感激,让我试一试,然后再打电话给你为什么要投反对票?我是stackoverflow的新手,在其他论坛发布代码是不是很糟糕?