Java去掉JFrame默認窗體樣式(裝飾)

目錄

拖動菜單移動窗體

菜單欄拖動事件


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) {}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章