Por defecto, el propio Frame o JFrame tiene implementada la función de mover la ventana arrastrando la barra de título con el mouse.
Sin embargo, cuando no está satisfecho con el estilo JFrame de Java, oculta la barra de título y los bordes, o simplemente usa JWindow directamente, ¿cómo puede lograr el propósito de mover la ventana arrastrando el mouse? Al principio, simplemente usé frame.setLocation(e.getX(), e.getY()) en el método mouseDragged. Como resultado, el marco seguía parpadeando cuando lo arrastraba y la posición seguía saltando en la pantalla. Más tarde busqué información en línea y encontré la respuesta.
A continuación se muestra un ejemplo sencillo que será fácil de entender de un vistazo:
paquete com.jebysun.test.globalhotkey; importar java.awt.Color; importar java.awt.Cursor; importar java.awt.event.MouseEvent; .JWindow; import javax.swing.event.MouseInputListener; /** * Personaliza la ventana del programa y se puede arrastrar el mouse para mover su posición. * @author Jeby Sun * */ public class MyFrame extends JWindow { private static final long serialVersionUID = 1L; JLabel titleLbl; public MyFrame() { // Para establecer el color de fondo, no puedes llamar directamente a su método setBackground, pero sí establecer el fondo. color de su ContentPane . this.getContentPane().setBackground(new Color(0x99FF66)); this.setBounds(100,100,600,400); this.setLayout(null); titleLbl = new JLabel("Barra de título de ventana personalizada"); .setBackground(nuevo color(0x66CC00)); titleLbl.setBounds(0, 0, 600, 30); this.add(titleLbl); // Clase de manejo de eventos del mouse MouseEventListener mouseListener = new MouseEventListener(this); .setVisible(true); } /** *Manejo de eventos del mouse* @author Jeby Sun * */ class MouseEventListener implements MouseInputListener { Point origin; //Arrastre el componente de destino que desea mover con el mouse MyFrame frame; public MouseEventListener(MyFrame frame) { this.frame = frame; new Point() } @Override; public void mouseClicked(MouseEvent e) {} /** * Registre el punto cuando se presiona el mouse*/ @Override public void mousePressed(MouseEvent e) { origin.x = e.getX(); origin.y = e.getY(); } @Override public void mouseReleased(MouseEvent e) {} /** * Cuando el mouse se mueve hacia la barra de título, establezca el ícono del mouse en el ícono del móvil* / @Override public void mouseEntered(MouseEvent e) { this.frame.setCursor(Cursor.getPredefinidoCursor(Cursor.MOVE_CURSOR) } /** *); Cuando el mouse salga de la barra de título, establezca el ícono del mouse como puntero predeterminado */ @Override public void mouseExited(MouseEvent e) { this.frame.setCursor(Cursor.getPredefinidoCursor(Cursor.DEFAULT_CURSOR) } /** * Arrastre el mouse en la barra de título Al arrastrar, establezca la posición de coordenadas de la ventana * la nueva posición de coordenadas de la ventana = la posición de coordenadas antes de mover + (las coordenadas actuales del puntero del mouse - la posición del puntero cuando el mouse está presionado) */ @Override public void mouseDragged(MouseEvent e) { Punto p = this.frame.getLocation(); this.frame.setLocation( px + (e.getX() - origin.x), py + (e.getY() - origen. y)); } @Override public void mouseMoved(MouseEvent e) {} } public static void main(String[] args) { new MyFrame();