java swing 自定义标题栏及拖动

不废话,说正事。

1.要实现自定义标题栏,首先要隐藏默认的标题栏,代码如下:

frame.setUndecorated(true); // 隐藏窗口标题栏

2.接下来自己设计一个标题栏,个人简易版代码如下:

	/**
	 * 自定义标题栏
	 * @return
	 */
	public static JPanel getCustomTitle(JFrame frame) {
		JPanel titlePanel = new JPanel();
		titlePanel.setLayout(new FlowLayout(FlowLayout.RIGHT));// 右对齐
		titlePanel.add(new JLabel("自定义标题"));
		titlePanel.setBackground(Color.lightGray);
		JButton closeBtn = new JButton("X");
		JButton minBtn = new JButton("一");
		//关闭按钮监听
		closeBtn.addActionListener(e -> {
			frame.dispose();
        });
        //最小化按钮监听
		minBtn.addActionListener(e -> {
			frame.setExtendedState(JFrame.ICONIFIED);
        });
		titlePanel.add(minBtn);
		titlePanel.add(closeBtn);
		return titlePanel;
	}

3.实现拖动功能。有默认标题栏的时候,窗口是可以拖动的,自定义标题栏后,窗口拖不动了,需要给窗口加一个拖动的监听事件,代码如下:

public class MouseDraggedListener extends MouseAdapter{

	//这两组x和y为鼠标点下时在屏幕的位置和拖动时所在的位置
	int newX,newY,oldX,oldY;
	//这两个坐标为组件当前的坐标
	int startX,startY;

	@Override
	public void mousePressed(MouseEvent e) {
		//此为得到事件源组件
		Component cp = (Component)e.getSource();
		//当鼠标点下的时候记录组件当前的坐标与鼠标当前在屏幕的位置
		startX = cp.getX();
		startY = cp.getY();
		oldX = e.getXOnScreen();
		oldY = e.getYOnScreen();
	}
	@Override
	public void mouseDragged(MouseEvent e) {
		Component cp = (Component)e.getSource();
		//拖动的时候记录新坐标
		newX = e.getXOnScreen();
		newY = e.getYOnScreen();
		//设置bounds,将点下时记录的组件开始坐标与鼠标拖动的距离相加
		cp.setBounds(startX+(newX - oldX), startY+(newY - oldY), cp.getWidth(),             
        cp.getHeight());
	}
}

4.准备工作都做好了,最后是整体的调用,代码如下:

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		
		frame.setSize(500, 350);// 宽度、高度
		frame.setLocationRelativeTo(null); // 窗口居中
		frame.setUndecorated(true); // 隐藏窗口标题栏
		
		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(getCustomTitle(frame), BorderLayout.NORTH);// 添加自定义的标题栏
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 鼠标拖动事件
		MouseDraggedListener m = new MouseDraggedListener();
		frame.addMouseListener(m);
		frame.addMouseMotionListener(m);
	}

OK,下课。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值