我怎样才能实现新的JFrame功能

时间:2009-12-21 19:59:53

标签: java swing jframe

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

4 个答案:

答案 0 :(得分:4)

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

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

另一方面,您可以使用:

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

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

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

答案 1 :(得分: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);
        }
    }
});

答案 2 :(得分:1)

看看这篇文章 - 我认为它几乎是你对JFrame部分的需求。

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

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

答案 3 :(得分:-1)

对于JInternalFrames ......

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