禁用装饰后JFrame无法移动,添加MouseListener仍无效求排查
问题原因与修复方案
核心错误
mouseDragged 方法属于 MouseMotionListener 接口,而非 MouseListener。你仅给JFrame添加了MouseListener,拖动事件根本不会被触发。
MouseAdapter是一个适配器类,它同时实现了MouseListener和MouseMotionListener的空方法,但如果只调用addMouseListener,只有鼠标按下、释放等MouseListener的事件会被捕获,拖动事件(属于MouseMotionListener)不会生效。
修复后的代码
public static void main(String[] args) { try { UIManager.setLookAndFeel(new FlatDarkLaf()); } catch (Exception errorDesign) { logError(errorDesign); } JFrame frame = new JFrame(); frame.setBounds(1600, 400, 500, 800); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setUndecorated(true); // 创建拖动适配器 MouseAdapter dragAdapter = new MouseAdapter() { private Point mouseOffset; @Override public void mousePressed(MouseEvent e) { // 记录鼠标相对于窗口左上角的偏移量 mouseOffset = e.getPoint(); } @Override public void mouseDragged(MouseEvent e) { // 计算窗口新位置 Point newLocation = e.getLocationOnScreen(); newLocation.translate(-mouseOffset.x, -mouseOffset.y); frame.setLocation(newLocation); } }; // 同时添加MouseListener和MouseMotionListener frame.addMouseListener(dragAdapter); frame.addMouseMotionListener(dragAdapter); // 最后显示窗口(建议放在配置完成后) frame.setVisible(true); }
额外优化说明
- 将
frame.setVisible(true)移到所有配置(监听器、窗口属性)完成之后,这是Swing组件初始化的标准顺序,避免出现组件未完全初始化就显示的问题。 - 代码中添加了注释说明关键逻辑,确保拖动时鼠标位置和窗口的相对关系不变,避免窗口跳变。
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

