目录
拖动菜单移动窗体
菜单栏拖动事件
JFrame自带的窗体装饰很难看,所以我们可以自定义个窗体样式
首先,我们需要去掉默认装饰
使用JFrame的 setUndecorated 方法
frame.setUndecorated(true);
去掉窗体样式后,就会需要很多的...麻烦
需要自己写窗口最小化最大化关闭按钮,和logo什么的,还有拖动...
拖动菜单移动窗体
下面是我写的一个案例,通过菜单栏拖动 移动窗体(使用的 Window Classic风格).

没去掉默认样式之前是这样的

代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /** * 第一个窗体,主窗体. * @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); } } |
菜单栏拖动事件
我们通过鼠标监听来进行移动窗体
计算方法是 当前窗体位置 - 鼠标目前位置 - 鼠标上次位置
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /** * 菜单栏事件,包含点击,拖动等.<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) {} } |