728x90

이제 Window이벤트를 마지막으로 블로그에서 이벤트에 대한 소개를 마치려고한다.

물론 이벤트의 갯수가 더 많고 유용한것도 많지만 다 소개하려면 양이 너무 많다.

따라서 가장 많이 사용하는 몇개의 이벤트만 소개하려고 했었고 이번에 사용하는 Window이벤트가 그 마지막이라고 할 수 있다.


import java.awt.GridLayout;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestSwing {

public static void main(String[] args) {
JFrame fr = new JFrame("This 프레임");
JPanel pn = new JPanel();
JLabel lbl = new JLabel("초기상황");

pn.setLayout(new GridLayout(1, 1));
pn.add(lbl);

fr.setContentPane(pn);
fr.addWindowListener(new WindowListener() {

@Override
public void windowOpened(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowOpened()");
}

@Override
public void windowIconified(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowIconified()");
}

@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowDeiconified()");
}

@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowDeactivated()");
}

@Override
public void windowClosing(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowClosing()");
}

@Override
public void windowClosed(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowClosed()");
}

@Override
public void windowActivated(WindowEvent e) {
System.out.println("TestSwing.main(...).new WindowListener() {...}.windowActivated()");
}
});

fr.setSize(500, 500);
fr.setVisible(true);
}
}


각각 어느 상황에서 사용되는지 한번 확인해보자.

윈도우를 키우고 내리고 이런 상황에 반응하게 된다.


WindowListener의 메소드


windowOpened : 윈도우가 처음 생성됬을 때 발생

windowIconified : 윈도우가 최소화 됬을 때 발생

windowDeiconified : 윈도우가 최소화에서 최대화 됬을 때 발생

windowDeactivated : 윈도우가 비활성화 됬을 때 발생

windowClosing : 윈도우의 시스템 메뉴의 닫기를 시도할 때 발생

windowClosed : 윈도우가 닫힐 때 발생

windowActivated : 윈도우가 활성활 될 때 발생


이제 각각의 메소드를 알았다. 이 이벤트를 이용해서 지금까지의 프로그램의 문제점을 해결해보자.

여러분은 이때까지 X표를 눌러서 프로그램을 종료시켰다.

그러나 사실 이렇게 프로그램은 종료되지 않는다. 껍데기만 사라질뿐 실제로는 메모리를 잡아먹는다.



여러번 실행한후 작업관리자를 보면 놀랍게도 종료되지 않고 메모리를 처먹고 있는 모습을 볼 수 있다.

사실 x를 누른다고 종료되는게 아니다. 따라서 우리는 종료하는 로직을 추가시켜줘야한다.

그러면 종료하는 로직을 추가시켜보자.


import java.awt.GridLayout;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestSwing {

public static void main(String[] args) {
JFrame fr = new JFrame("This 프레임");
JPanel pn = new JPanel();
JLabel lbl = new JLabel("초기상황");

pn.setLayout(new GridLayout(1, 1));
pn.add(lbl);

fr.setContentPane(pn);
fr.addWindowListener(new WindowListener() {

@Override
public void windowOpened(WindowEvent e) {
}

@Override
public void windowIconified(WindowEvent e) {
}

@Override
public void windowDeiconified(WindowEvent e) {
}

@Override
public void windowDeactivated(WindowEvent e) {
}

@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}

@Override
public void windowClosed(WindowEvent e) {
}

@Override
public void windowActivated(WindowEvent e) {
}
});

fr.setSize(500, 500);
fr.setVisible(true);
}
}


시스템을 종료하려면 Closing메소드를 건드려줘야한다.

이 안에 System.exit(0);를 적어넣으면 이제 제대로 종료되는 것을 확인할 수 있다.


Swing에서의 프로세서 종료


사실 위의 방식은 awt에서나 사용하던 방식이다. swing에서는 이렇게 종료하지 않는다.

종료하나를 위해서 위의 길다란 코드를 쓰는건 배보다 배꼽이 더큰 느낌을 준다.

Swing에서는 훨씬 간단한 방법으로 종료할 수 있다.

위의 이벤트를 모조리삭제하자.


import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestSwing {

public static void main(String[] args) {
JFrame fr = new JFrame("This 프레임");
JPanel pn = new JPanel();
JLabel lbl = new JLabel("초기상황");

pn.setLayout(new GridLayout(1, 1));
pn.add(lbl);

fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setContentPane(pn);

fr.setSize(500, 500);
fr.setVisible(true);
}
}


이렇게 간략한 코드로 프로세서를 완전 종료시킬 수 있다.

그렇다고 windowlistener가 의미없는건 당연히 아니다.

'Programming > Java-Swing' 카테고리의 다른 글

[Swing-09]Event-Focus  (0) 2017.10.27
[Swing-08]Evnet-Item  (0) 2017.10.27
[Swing-07]Evnet-Mouse  (0) 2017.10.25
[Swing-06]Event-Key  (0) 2017.10.24
[Swing-05]Event-Action  (0) 2017.10.21

+ Recent posts