目錄
JFrame自帶的窗體裝飾很難看,所以我們可以自定義個窗體樣式
首先,我們需要去掉默認裝飾
使用JFrame的 setUndecorated 方法
frame.setUndecorated(true);
去掉窗體樣式後,就會需要很多的...麻煩
需要自己寫窗口最小化最大化關閉按鈕,和logo什麼的,還有拖動...
拖動菜單移動窗體
下面是我寫的一個案例,通過菜單欄拖動 移動窗體(使用的 Window Classic風格).
沒去掉默認樣式之前是這樣的
代碼如下
/**
* 第一個窗體,主窗體.
* @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);
}
}
菜單欄拖動事件
我們通過鼠標監聽來進行移動窗體
計算方法是 當前窗體位置 - 鼠標目前位置 - 鼠標上次位置
代碼如下
/**
* 菜單欄事件,包含點擊,拖動等.<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) {}
}