-
02. 타이틀바 삭제[Java] 단축키 안내 프로그램 2021. 2. 9. 21:22
안녕하세요 Becca입니다!
단축키 안내 프로그램의 두 번째 시간입니다.
이번 글에서는 프레임의 타이틀바를 삭제하고, 프레임의 이동방법을 수정해보도록 하겠습니다.
프레임의 타이틀바를 삭제하는 이유는 디자인을 할 때 이상하게 보였기 때문입니다.
그러므로 타이틀바를 삭제하고, 프레임의 이동방법을 수정해보도록 하겠습니다.
(프레임의 이동은 타이틀바를 마우스로 클릭하여 드래그를 하는 방식인데, 타이틀바를 삭제하여 이 방법이 막힙니다.)
[타이틀바 삭제 방법]
MainFrame()에서 프레임의 타이틀바를 삭제하고, 크기 변경을 불가능하도록 하는 코드를 작성합니다.
(크기 변경 불가능은 디자인을 했을 때, 망가지지 않도록 하기 위해서 넣었습니다.)
public MainFrame() { setResizable(false); // 크기 변경 불가능하도록 함 setUndecorated(true); // 프레임의 타이틀바를 없앰 // setTitle("MainFrame") // 프레임의 타이틀바를 없애서 타이틀은 필요 없음 setSize(1100, 700); setVisible(true); }
이제, 프로그램을 실행하면 아래처럼 타이틀바가 없어진 프레임이 나옵니다.
타이틀바가 없어서 프로그램을 종료하려면 작업 표시줄에서 X버튼을 눌러 종료시켜야 합니다.
(나중에 메인 페이지에서 종료할 수 있도록 버튼을 추가할 예정입니다.)
[프레임 이동방법 수정]
1. 마우스를 클릭한 곳의 좌표를 저장하기 위해 initialClick을 선언합니다.
public class MainFrame extends JFrame { private Point initialClick; // 마우스의 x, y 좌표를 저장하기 위해 선언 public MainFrame() { ... } }
2. java.awt.* 와 java.awt.event.*을 import 합니다.
import javax.swing.*; import java.awt.*; // Point를 사용하기 위해 import import java.awt.event.*; // event를 위해 import
3. 마우스가 클릭될 경우에 대한 event를 발생시키기 위해 MouseListener(),
3. 드래그될 경우에 대한 event를 발생시키기 위해 MouseMotionListener()를 MainFrame() 안에 적어줍니다.
public MainFrame() { setResizable(false); setUndecorated(true); // setTitle("MainFrame") setSize(1100, 700); setVisible(true); this.addMouseListener(new moveWindows()); // 윈도우 이동하기 위해 설정 this.addMouseMotionListener(new moveWindows()); // 윈도우 이동하기 위해 설정 }
4. event가 발생했을 때 원하는 동작을 수행할 클래스 moveWindows()를 선언하고,
4. MouseAdapter를 상속받습니다. (MouseListener(), MouseMotionListener()를 모두 포함하고 있습니다.)
// 프레임 이동 (타이틀바를 없애서 이동 불가능한 것을 가능하도록 함) class moveWindows extends MouseAdapter { }
5. 마우스가 눌린 경우인 mousePressed()에 현재 좌표를 저장하고, 컴포넌트를 리턴받습니다.
class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { /* 5번 */ initialClick = e.getPoint(); // 현재 좌표 저장 getComponentAt(initialClick); // 저장한 좌표를 포함한 컴포넌트를 리턴 받음 } }
6. 마우스가 드래그된 경우인 mouseDragged()에서, 드래그 된 프레임의 정보를 jf에 저장합니다.
class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { initialClick = e.getPoint(); getComponentAt(initialClick); } public void mouseDragged(MouseEvent e) { /* 6번 */ JFrame jf = (JFrame) e.getSource(); // 드래그 된 JFrame의 정보를 받아옴 } }
7. jf의 x, y 좌표를 저장합니다.
class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { initialClick = e.getPoint(); getComponentAt(initialClick); } public void mouseDragged(MouseEvent e) { JFrame jf = (JFrame) e.getSource(); /* 7번 */ int thisX = jf.getLocation().x; // jf의 x 값을 저장함 int thisY = jf.getLocation().y; // jf의 y 값을 저장함 } }
8. 현재 마우스 위치의 좌표와 처음 마우스를 클릭한 위치의 좌표를 빼서 저장합니다.
class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { initialClick = e.getPoint(); getComponentAt(initialClick); } public void mouseDragged(MouseEvent e) { JFrame jf = (JFrame) e.getSource(); int thisX = jf.getLocation().x; int thisY = jf.getLocation().y; /* 8번 */ int xMoved = e.getX() - initialClick.x; int yMoved = e.getY() - initialClick.y; // 현재 마우스 위치의 x, y좌표 - 첫 마우스 클릭 위치 x, y좌표 // initialClick를 하지 않으면 (0, 0)에 포인터가 고정된채로 움직임 } }
9. jf의 좌표와 8번에서 저장한 좌표를 더해 저장합니다.
class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { initialClick = e.getPoint(); getComponentAt(initialClick); } public void mouseDragged(MouseEvent e) { JFrame jf = (JFrame) e.getSource(); int thisX = jf.getLocation().x; int thisY = jf.getLocation().y; int xMoved = e.getX() - initialClick.x; int yMoved = e.getY() - initialClick.y; /* 9번 */ int X = thisX + xMoved; // jf x값 + 이동한 x 값 int Y = thisY + yMoved; // jf y값 + 이동한 y 값 } }
10. jf의 좌표를 9번의 좌표로 변경합니다.
class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { initialClick = e.getPoint(); getComponentAt(initialClick); } public void mouseDragged(MouseEvent e) { JFrame jf = (JFrame) e.getSource(); int thisX = jf.getLocation().x; int thisY = jf.getLocation().y; int xMoved = e.getX() - initialClick.x; int yMoved = e.getY() - initialClick.y; int X = thisX + xMoved; int Y = thisY + yMoved; /* 10번 */ jf.setLocation(X, Y); // jf의 위치 변경 } }
6 ~ 10번 과정이 이해되지 않는다면 아래 표를 참고해주세요.
이제, 프로그램을 실행하고 프레임 안쪽을 클릭해 드래그를 하면 프레임이 움직입니다!
[메인 프레임 전체 코드]
package main_page; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MainFrame extends JFrame { private Mainpg m_pg = null; private Point initialClick; public MainFrame() { setResizable(false); setUndecorated(true); // setTitle("MainFrame") setSize(1100, 700); setVisible(true); this.addMouseListener(new moveWindows()); this.addMouseMotionListener(new moveWindows()); } class moveWindows extends MouseAdapter { public void mousePressed(MouseEvent e) { initialClick = e.getPoint(); getComponentAt(initialClick); } public void mouseDragged(MouseEvent e) { JFrame jf = (JFrame) e.getSource(); int thisX = jf.getLocation().x; int thisY = jf.getLocation().y; int xMoved = e.getX() - initialClick.x; int yMoved = e.getY() - initialClick.y; int X = thisX + xMoved; int Y = thisY + yMoved; jf.setLocation(X, Y); } } public static void main(String[] args) { MainFrame mf = new MainFrame(); } }
여기까지 잘 따라오셨나요?
타이틀바 삭제는 쉽지만 프레임의 이동 방법을 수정하는 과정에서 코드의 이해가 어려웠을거라 생각합니다.
이해가 잘 되지 않는다면 그 과정을 다시 보거나, 위의 표를 참고하여 계산을 해보셨으면 좋겠습니다!
다음 글에서는 메인 페이지를 만들어보도록 하겠습니다.
다음 글에서 만나요!
'[Java] 단축키 안내 프로그램' 카테고리의 다른 글
04. 크롤링 (0) 2021.03.02 03. 메인 페이지 (0) 2021.02.17 01. 메인 프레임 (0) 2021.01.08 00. 프로그램 소개 (0) 2021.01.02