微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何移动未修饰的 JFrame 窗口?

如何解决如何移动未修饰的 JFrame 窗口?

所以我一直在开发一个程序,我想用 jframe.setUndecorated(true); 使它无边界。但是,我无法真正在屏幕上移动 JFrame 窗口。有什么办法可以解决这个问题吗?

这是我当前的 JFrame 代码

JFrame frame = new JFrame();
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700,450);
frame.setLocationRelativeto(null);
frame.setUndecorated(true);
frame.getContentPane().setBackground(Color.BLACK);

解决方法

要移动 JFrame,请在 JFrame 内的某处左键单击,将鼠标拖动到新位置,并在 JFrame 处于正确位置时释放鼠标按钮。

这是完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MoveUndecoratedJFrame implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new MoveUndecoratedJFrame());
    }
    
    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        
        frame.add(createMainPanel(),BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        MoveListener listener = new MoveListener();
        panel.addMouseListener(listener);
        panel.addMouseMotionListener(listener);
        panel.setBackground(Color.BLACK);
        panel.setPreferredSize(new Dimension(700,400));
        
        return panel;
    }
    
    public class MoveListener implements MouseListener,MouseMotionListener {
        
        private Point pressedPoint;
        private Rectangle frameBounds;
        
        @Override
        public void mouseClicked(MouseEvent event) {
        }

        @Override
        public void mousePressed(MouseEvent event) {
            this.frameBounds = frame.getBounds();
            this.pressedPoint = event.getPoint();
        }

        @Override
        public void mouseReleased(MouseEvent event) {
            moveJFrame(event);
        }

        @Override
        public void mouseEntered(MouseEvent event) {
        }

        @Override
        public void mouseExited(MouseEvent event) {
        }

        @Override
        public void mouseDragged(MouseEvent event) {
            moveJFrame(event);
        }

        @Override
        public void mouseMoved(MouseEvent event) {
        }
        
        private void moveJFrame(MouseEvent event) {
            Point endPoint = event.getPoint();
            
            int xDiff = endPoint.x - pressedPoint.x;
            int yDiff = endPoint.y - pressedPoint.y;
            frameBounds.x += xDiff;
            frameBounds.y += yDiff;
            frame.setBounds(frameBounds);
        }
        
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。