본문 바로가기

Today I Learned

JAVA GUI : Create New Window

버튼을 클릭하면 새로운 윈도우 창이 나오는 프로그램이다.

다음과 같이 메인 함수를 만들어주고

public class Main {

	public static void main(String[] args) {
		LaunchPage launchPage = new LaunchPage();
	}

}

처음 화면을 실행하면 LaunchPage가 나타난다. LaunchPage는 버튼이 있는 페이지이다.

public class LaunchPage implements ActionListener {
	//components
	JFrame frame = new JFrame();
	JButton myButton = new JButton("Hello duckky");
	
	LaunchPage() {
		myButton.setBounds(100, 160, 200, 40);
		myButton.setFocusable(false);
		myButton.addActionListener(this);
		
		frame.setSize(420,420);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(null);
		frame.setVisible(true);

		frame.add(myButton);
	}

클래스의 생성자 위에 JFrame와 JButton을 만든다. 이렇게 외부에서 객체를 사용할 수 있게끔 코드를 작성하면 좋다.

버튼에는 addActionListener() 키워드로 액션리스너를 단다.

ActionListener란 버튼을 클릭했을때 이벤트를 발생할 수 있도록 만들어주는 것이다.

		myButton.addActionListener(this);
  • extends
    • 부모에서 선언/정의를 모두하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.
    • 부모의 특징을 확장해서 사용한다.
  • implements (interface 구현)
    • 부모 객체는 선언만 하며, 정의는 반드시 자식이 오버라이딩해서 사용한다. 즉, 껍데기만 존재
    • 반드시 구현해야 하는 메소드가 존재한다.

클래스를 만들때 ActionListener를 implements 했기 때문에

반드시 actionPerformed()이라는 메소드를 구현해야 한다.

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == myButton) {
//			frame.dispose(); //새로운 페이지가 나타날때 기존 페이지를 삭제
			NewWindow myWindow = new NewWindow();
		}
		
	}

만약 버튼을 클릭하면 새로운 창인 NewWindow 가 나타나게 된다.

 

NewWindow 클래스는 프레임과 레이블, 아이콘으로 구성되어 있는 클래스이다.

public class NewWindow {
	JFrame frame = new JFrame();
	JLabel label = new JLabel("Hello");
	ImageIcon icon = new ImageIcon("duck.png");
	
	NewWindow() {
		label.setBounds(0, 0, 300, 300);
		label.setFont(new Font("Serif", Font.PLAIN, 30));
		label.setIcon(icon);
		
		frame.add(label);
		frame.setSize(420,420);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(null);
		frame.setVisible(true);
	}

}

 

메인 함수를 실행하면 연결된 LaunchPage가 나타나고

안에 있는 버튼을 클릭하면 연결된 NewWindow 페이지가 나타난다.

참고로 새로운 페이지가 나타날 때 기존 페이지를 삭제하고 싶다면 dispose() 메소드를 프레임에 적용하면 된다.