Por padrão, o próprio Frame ou JFrame implementou a função de mover a janela arrastando a barra de título com o mouse.
No entanto, quando você não está satisfeito com o estilo JFrame do Java, oculta a barra de título e as bordas ou simplesmente usa o JWindow diretamente, como pode atingir o objetivo de mover a janela arrastando o mouse? No início, simplesmente usei frame.setLocation(e.getX(), e.getY()) no método mouseDragged. Como resultado, o quadro continuou piscando quando eu o arrastei e a posição continuou saltando na tela. Mais tarde, procurei informações online e encontrei a resposta.
Aqui está um exemplo simples que será fácil de entender rapidamente:
pacote com.jebysun.test.globalhotkey; importar java.awt.Color; importar java.swing.JLabel; .JWindow; import javax.swing.event.MouseInputListener; /** * Personalize a janela do programa e o mouse pode ser arrastado para mover sua posição. * @author Jeby Sun * */ public class MyFrame extends JWindow { private static final long serialVersionUID = 1L; public MyFrame() { //Para definir a cor do plano de fundo, você não pode chamar diretamente seu método setBackground, mas definir o plano de fundo cor do seu ContentPane . this.getContentPane().setBackground(new Color(0x99FF66)); this.setBounds(100.100.600.400); this.setLayout(null); .setBackground(nova cor(0x66CC00)); titleLbl.setBounds(0, 0, 600, 30); this.add(titleLbl); //classe de manipulação de eventos de mouse MouseEventListener mouseListener = new MouseEventListener(this); .setVisible(true } /** *Manipulação de eventos do mouse* @author Jeby Sun * */ class MouseEventListener implements MouseInputListener { Point origin; //Arraste o componente alvo que deseja mover com o mouse frame MyFrame; public void mouseClicked(MouseEvent e) {} /** * Registra o ponto quando o mouse é pressionado*/ @Override public void mousePressed(MouseEvent e) { origin.x = e.getX(); origin.y = e.getY() } @Override public void mouseReleased(MouseEvent e) {} /** * Quando o mouse se move para a barra de título, defina o ícone do mouse para o ícone do celular* / @Override public void mouseEntered(MouseEvent e) { this.frame.setCursor(Cursor.getPredefinidoCursor(Cursor.MOVE_CURSOR) } /** * Quando o mouse sair da barra de título, defina o ícone do mouse como o ponteiro padrão */ @Override public void mouseExited(MouseEvent e) { this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) } /** * Arraste o mouse na barra de título Ao arrastar, defina a posição das coordenadas da janela * a nova posição das coordenadas da janela = a posição das coordenadas antes de mover + (as coordenadas atuais do ponteiro do mouse - a posição do ponteiro quando o mouse é pressionado) */ @Override public void mouseDragged(MouseEvent e) { Ponto p = this.frame.getLocation(); this.frame.setLocation( px + (e.getX() - origem.x), py + (e.getY() - origem. y)); } @Override public void mouseMoved(MouseEvent e) {} } public static void main(String[] args) { new MyFrame() } }