java swing 自定义标题栏及拖动
不废话,说正事。要实现自定义标题栏,首先要隐藏默认的标题栏,代码如下:frame.setUndecorated(true); // 隐藏窗口标题栏
·
不废话,说正事。
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,下课。
点击阅读全文
更多推荐
所有评论(0)