По умолчанию в Frame или JFrame реализована функция перемещения окна путем перетаскивания строки заголовка мышкой.
Однако если вас не устраивает стиль Java JFrame, вы скрываете строку заголовка и границы или просто используете JWindow напрямую, то как вы сможете достичь цели перемещения окна путем перетаскивания мыши? Сначала я просто использовал Frame.setLocation(e.getX(), e.getY()) в методе mouseDragged. В результате фрейм продолжал мерцать, когда я его перетаскивал, а позиция продолжала прыгать на экране. Позже я поискал информацию в Интернете и нашел ответ.
Вот простой пример, который легко понять с первого взгляда:
пакет com.jebysun.test.globalhotkey; импорт java.awt.Cursor; импорт java.awt.Point; импорт javax.swing.JLabel; .JWindow; import javax.swing.event.MouseInputListener; /** * Настройте окно программы, и его можно будет перетаскивать с помощью мыши. * @author Jeby Sun * */ public class MyFrame расширяет JWindow { Private static Final Long SerialVersionUID = 1L JLabel titleLbl; public MyFrame() { // Чтобы установить цвет фона, вы не можете напрямую вызвать его метод setBackground, но можете установить фон. цвет его ContentPane . this.getContentPane().setBackground(new Color(0x99FF66)); this.setBounds(100,100,600,400); this.setLayout(null); titleLbl = new JLabel("Настраиваемая строка заголовка окна"); .setBackground(новый цвет(0x66CC00)); titleLbl.setBounds(0, 0, 600, 30); this.add(titleLbl); //Класс обработки событий мыши MouseEventListener mouseListener = new MouseEventListener(this); titleLbl.addMouseListener(mouseListener); .setVisible(true); } /** *Обработка событий мыши* @author Jeby Sun * */ класс MouseEventListener реализует MouseInputListener { Point origin; // Перетащите целевой компонент, который хотите переместить, с помощью мыши MyFrameframe; public MouseEventListener(MyFrameframe) { this.frame =frame; new Point(); public void mouseClicked(MouseEvent e) {} /** * Записываем момент нажатия мыши*/ @Override public void mousePressed(MouseEvent e) { origin.x = e.getX(); origin.y = e.getY(); } @Override public void mouseReleased(MouseEvent e) {} /** * Когда мышь перемещается в строку заголовка, установите значок мыши на значок мобильного устройства* / @Override public void mouseEntered(MouseEvent e) { this.frame.setCursor(Cursor.getPredefineCursor(Cursor.MOVE_CURSOR) } /** * Когда мышь выходит за пределы строки заголовка, установите значок мыши в качестве указателя по умолчанию */ @Override public void mouseExited(MouseEvent e) { this.frame.setCursor(Cursor.getPredefineCursor(Cursor.DEFAULT_CURSOR) } /**); * Перетащите мышкой по строке заголовка. При перетаскивании задайте координатное положение окна * новое координатное положение окна = координатное положение до перемещения + (текущие координаты указателя мыши - положение указателя при наведении курсора мыши на нажата) */ @Override public void mouseDragged(MouseEvent e) { Point p = this.frame.getLocation(); this.frame.setLocation( px + (e.getX() - origin.x), py + (e.getY() - origin. y)); } @Override public void mouseMoved(MouseEvent e) {} } public static void main(String[] args) {new MyFrame() } }