Java去掉JFrame默认窗体样式(装饰)

目录

拖动菜单移动窗体

菜单栏拖动事件


JFrame自带的窗体装饰很难看,所以我们可以自定义个窗体样式

首先,我们需要去掉默认装饰

使用JFrame的 setUndecorated 方法

frame.setUndecorated(true);

去掉窗体样式后,就会需要很多的...麻烦

需要自己写窗口最小化最大化关闭按钮,和logo什么的,还有拖动...


拖动菜单移动窗体

下面是我写的一个案例,通过菜单栏拖动 移动窗体(使用的 Window Classic风格).

没去掉默认样式之前是这样的

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
 * 第一个窗体,主窗体.
 * @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
 * @version 1.0
 */
public class MainView extends JFrame {
    private static final long serialVersionUID = 1000L;
    static Point p = new Point();
   
    public MainView() throws IOException {
        setTitle("任务管理");
        // 设置图标
              //setIconImage(ImageIO.read(getClass().getResourceAsStream("/shendi_app_logo.png")));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 549, 370);
        // 去掉样式
        setUndecorated(true);
       
        // 拖动菜单栏事件,鼠标点击记录位置
        MenuBarEvent menuBarEvent = new MenuBarEvent(this);
        JMenuBar menuBar = new JMenuBar();
        menuBar.addMouseListener(menuBarEvent);
        menuBar.addMouseMotionListener(menuBarEvent);
       
        JMenu setting = new JMenu("设置");
        menuBar.add(setting);
       
        JMenuItem exit = new JMenuItem("退出程序");
       
        JCheckBoxMenuItem netSave = new JCheckBoxMenuItem("云端保存");
        setting.add(netSave);
        setting.add(exit);
       
        JMenu helpMenu = new JMenu("帮助");
        menuBar.add(helpMenu);
       
        JMenuItem aboutUS = new JMenuItem("关于我们");
        helpMenu.add(aboutUS);
       
        setJMenuBar(menuBar);
        getContentPane().setLayout(null);
    }
   
    public static void main(String[] args) throws IOException {
        new MainView().setVisible(true);
    }

}

菜单栏拖动事件

我们通过鼠标监听来进行移动窗体

计算方法是 当前窗体位置 - 鼠标目前位置 - 鼠标上次位置

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 * 菜单栏事件,包含点击,拖动等.<br>
 * 窗口拖动效果,鼠标点击记录位置,拖动将位置设置<br>
 * <b>拖动的窗体位置 = 窗体当前位置 + 现在的鼠标位置 - 鼠标上次保存的位置</b>
 * @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
 * @version 1.0
 */
public class MenuBarEvent extends MouseAdapter implements MouseMotionListener {
    private int xOffset,yOffset;

    /**
     * 需要被控制的窗体.
     */
    private JFrame frame;
   
    /**
     * 创建一个控制指定窗体的菜单栏事件.
     * @param frame 窗体.
     */
    public MenuBarEvent(JFrame frame) { this.frame = frame; }
   
    /**
     * 鼠标拖动后移动窗体.
     */
    @Override public void mouseDragged(MouseEvent mouse) {
        frame.setLocation(frame.getX() + mouse.getX() - xOffset, frame.getY() + mouse.getY() - yOffset);
    }
   
    /**
     * 鼠标按下后记录当前鼠标位置
     */
    @Override public void mousePressed(MouseEvent mouse) {
        xOffset = mouse.getX();
        yOffset = mouse.getY();
    }
   
    @Override public void mouseMoved(MouseEvent e) {}
}