如何在使用未装饰的JFrame时添加调整大小的支持?

10

我想自定义我的标题栏,包括最小化、最大化和关闭按钮。因此,我在我的JFrame上使用了setUndecorated(true),但我仍然希望能够改变窗口大小。最佳实现方式是什么?

我在RootPane上有一个边框,可以在Border或RootPane上使用MouseListeners。有任何建议吗?

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.LineBorder;

public class UndecoratedFrame extends JFrame {

    private LineBorder border = new LineBorder(Color.BLUE,2);
    private JMenuBar menuBar = new JMenuBar();
    private JMenu menu = new JMenu("File");
    private JMenuItem item = new JMenuItem("Nothing");

    public UndecoratedFrame() {
        menu.add(item);
        menuBar.add(menu);
        this.setJMenuBar(menuBar);
        this.setUndecorated(true);
        this.getRootPane().setBorder(border);
        this.setSize(400,340);
        this.setVisible(true);
    }

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

相关问题:https://dev59.com/vHE85IYBdhLWcg3wbS5h - Jonas
这里还有一个示例 - Paul Samsotha
3个回答

6
正如您所说,您的根面板上有一个边框。因此,至少有一个位置(在绘制边框的地方下面)是您的根面板最上层的组件。因此,您可以为其添加鼠标监听器和鼠标移动监听器。
当单击根面板时(并按下鼠标按钮),您的鼠标和移动监听器将通知您初始和实际鼠标位置。因此,您可以通过两个值之间的偏移量更新框架大小,使您的框架可调整大小。

这是一个非常微妙的答案。 - smwikipedia

5
我在RootPane中找到了一个好的方法,它给了我这个功能,现在我只需要找出如何自定义标题栏和其上的按钮。
我在UndecoratedFrame的构造函数中添加了this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
这方面还有更多阅读材料,请参考Sexy Swing App - 统一工具栏如何控制窗口装饰

更多阅读:http://javabyexample.wisdomplug.com/java-concepts/34-core-java/57-spice-up-your-swing-ui-with-substance.html - Jonas

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接