기본적으로 Frame이나 JFrame 자체에는 제목 표시줄을 마우스로 드래그하여 창을 이동하는 기능이 구현되어 있습니다.
하지만 Java의 JFrame 스타일이 마음에 들지 않거나 제목 표시줄과 테두리를 숨기거나 단순히 JWindow를 직접 사용하는 경우 마우스를 드래그하여 창을 이동하는 목적을 어떻게 달성할 수 있습니까? 처음에는 그냥 mouseDragged 메소드에 Frame.setLocation(e.getX(), e.getY())를 사용했는데, 그 결과 프레임을 드래그하면 프레임이 계속 깜빡거리고, 화면에서 위치가 계속 튀더군요. 나중에 인터넷에서 정보를 찾아보고 답을 찾았습니다.
다음은 한 눈에 이해하기 쉬운 간단한 예입니다.
package com.jebysun.test.globalhotkey; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing; .JWindow; import javax.swing.event.MouseInputListener; /** * 프로그램 창을 사용자 정의하고 마우스를 드래그하여 위치를 이동할 수 있습니다. * @author Jeby Sun * */ public class MyFrame extends 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); titleLbl = new JLabel("사용자 정의된 창 제목 표시줄") titleLbl .setBackground(new Color(0x66CC00)); titleLbl.setBounds(0, 0, 600, 30); this.add(titleLbl); //마우스 이벤트 처리 클래스 MouseEventListener mouseListener = new MouseEventListener(this) titleLbl.addMouseMotionListener(mouseListener); .setVisible(true) } /** *마우스 이벤트 처리* @author Jeby Sun * */ class MouseEventListener는 MouseInputListener를 구현합니다. //이동하려는 대상 구성 요소를 마우스로 드래그합니다. public MouseEventListener(MyFrame 프레임) { this.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.getPre DefinedCursor(Cursor.MOVE_CURSOR)) /** * 마우스가 제목 표시줄 밖으로 이동할 때 마우스 아이콘을 기본 포인터로 설정 */ @Override public void mouseExited(MouseEvent e) { this.frame.setCursor(Cursor.getPredefinatedCursor(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() - 원점. y)); } @Override public void mouseMoved(MouseEvent e) {} } public static void main(String[] args) { new MyFrame() } }