1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > java swing 自定义标题栏及拖动

java swing 自定义标题栏及拖动

时间:2023-09-25 15:51:25

相关推荐

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;@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,下课。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。