不废话,说正事。
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;@Overridepublic void mousePressed(MouseEvent e) {//此为得到事件源组件Component cp = (Component)e.getSource();//当鼠标点下的时候记录组件当前的坐标与鼠标当前在屏幕的位置startX = cp.getX();startY = cp.getY();oldX = e.getXOnScreen();oldY = e.getYOnScreen();}@Overridepublic 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,下课。