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

猜你喜欢

转载自blog.csdn.net/qq_41806966/article/details/106567490