자바 서브프레임 종료 - jaba seobeupeuleim jonglyo

JFrame f = new JFrame("Title");
f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

인자는 3가지가 존재..

1. DISPOSE_ON_CLOSE : 프레임과 컴포넌트를 종료(하지만 완전한 종료는 아님. 종료시에는 이벤트를 사용)

2. DO_NOTHING_ON_CLOSE : 프레임과 창닫기 작업을 무효화

3. HIDE_ON_CLOSE : false를 인수로 setVisible()메소드를 호출하여 윈도우를 숨김. setDefaultCloseOperation()메소드를 호출하지 않으면 이것이 기본 작업이 됨.

윈도가 숨겨진 후, true를 이누로 setVisible()을 호출하면 언제라도 다시 표시할 수 있음.


//멀티프레임 연동
import java.awt.*;
import java.awt.event.*;

public class  MainDemo extends Frame implements ActionListener
{
	Button open;
	Dimension dm;   //프레임 사이즈 정보를 알기위한 
	SubFrame sub;
	public MainDemo(){
		super(":: MainDemo ::");
		setSize(400, 400);
		dm=getSize();  //프레임의 사이즈 정보를 담은 Dimension얻기
		setLayout(null);
		//좌표를 잡아 컴포턴트를 붙이거나, 
		//컴포턴트 사이즈를 주고 싶다면 레이아웃을 해제하고 사용
		open = new Button("OPEN");
		add(open);
		open.setSize(150,150);//버튼의 사이즈
		Dimension bdm=open.getSize(); //버튼의 사이즈 정보를 가짐
		int centerX=(dm.width/2)-(bdm.width/2);
		int centerY=(dm.height-bdm.height)/2;

		open.setLocation(centerX,centerY); //버튼이 올라갈 x,y좌표를 설정

		// 리스너 부착
		open.addActionListener(this);

		// 서브프레임 생성
		sub =new SubFrame();
		// 서브프레임의 close버튼에 리스너 부착
		sub.close.addActionListener(this);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}//생성자-------

	public void actionPerformed(ActionEvent e) {
		Object o=e.getSource();
		if(o==open) {
		//1> SubFrame 객체를 생성하여 사이즈 정해주고 보여준다.
		
		
		//SubFrame sub = new SubFrame();
		// 서브프레임 close버튼에 리스너 부착---
                   //r,g,b값을 랜덤하게 주자 0-255
		  //Math.random()*범위 + 시작숫자
		 //   int r=(int)(Math.random()*256);
		 //	int g=(int)(Math.random()*256);
		 //	int b=(int)(Math.random()*256);
			java.util.Random rd=new java.util.Random();
			int r=rd.nextInt(256) + 0;
			int g=rd.nextInt(256) + 0;
			int b=rd.nextInt(256) + 0;


			sub.can.setBackground(new Color(r,g,b));

			sub.setSize(200,200);
			sub.setLocation(dm.width,0);
			sub.setVisible(true);
		}else if(o==sub.close) {
			// System.exit(0);  메인프레임까지 종료
			// sub.setVisible(false); 서브프레임 보이지 않게하는 효과
			sub.dispose();//Frame객체의 자원을 해제시킨다
		}
		
	}//------------
	
	public static void main(String[] args) 
	{
		MainDemo d=new MainDemo();
	/* 	d.setSize(500,500);
	    d.dm=d.getSize();
		System.out.println("d.dm.width:"+d.dm.width);
		System.out.println("d.dm.width:"+d.dm.height); */
		d.setVisible(true);
	}
}////////////////////////////////////

//메인 프레임에서 띄워줄 서브 프레임 클래스-----
class SubFrame extends Frame
{
	Canvas can;
	Button close;
	int r=100, g=100, b=100;
	public SubFrame() {
		can=new Canvas();
		add(can,"Center");
		can.setBackground(new Color(r,g,b));
		close=new Button("CLOSE");
		add(close, "South");
	}
}///////////////////////////

<명품 자바 에센셜> 8장 자바 GUI 스윙 기초 내용 정리

목차

☕ 자바의 GUI와 스윙(Swing) 응용프로그램 시작하기

1️⃣ 자바의 GUI

  GUI 응용프로그램이란?

  AWT와 Swing 패키지

  스윙 GUI 응용프로그램 샘플

2️⃣ 자바의 GUI 패키지

  GUI 패키지 계층 구조

  컨테이너와 컴포넌트

3️⃣ 스윙 GUI 프로그램 만들기

  1. 스윙 프레임 작성

  2. 프레임에 컴포넌트 붙이기

1️⃣ 자바의 GUI

GUI 응용프로그램이란?

  • GUI(Graphical User Interface)란 이미지 혹은 그래픽으로 그린 버튼, 메뉴 등이 있는 화면에 마우스와 같은 입력 도구를 이용하여 사용자가 편리하게 입출력할 수 있도록 만든 사용자 인터페이스이다.
  • 자바는 어떤 언어보다 강력한 GUI 라이브러리를 제공해서 다양한 GUI를 쉽게 구성할 수 있도록 도와준다.

AWT와 Swing 패키지

  • 자바는 GUI 응용프로그램을 쉽게 작성할 수 있도록 다양한 GUI component를 제공한다.
  • 자바의 GUI 컴포넌트는 AWT 컴포넌트(java.awt 패키지)와 Swing 컴포넌트(javax.swing 패키지)로 구분된다.

AWT 🆚 Swing

  • AWT(Abstract Windowing Toolkit)는 자바가 처음 나왔을 때 함께 배포된 GUI 패키지이다. 운영체제의 도움을 받아 GUI를 그리기 때문에 속도는 빠르나 운영체제에 부담을 줘서 AWT 컴포넌트는 중량 컴포넌트(heavy weight component)라고 불리고, 최근에는 거의 사용하지 않는다.
  • Swing은 AWT와 달리 순수하게 자바 언어로 작성되었다. 운영체제의 도움을 받지 않기 때문에 경량 컴포넌트(light weight component)라고 불린다. 스윙은 AWT보다 화려하고 더 많은 GUI 컴포넌트를 제공하며, 모든 컴포넌트 이름들이 대문자 J로 시작한다.
    • 스윙은 AWT에 구현된 이벤트 처리나 GUI 컴포넌트의 기본 원리를 바탕으로 작성되었기 때문에, 스윙을 사용하기 위해 AWT 패키지가 필요하다. (이때, AWT 컴포넌트와 AWT 패키지 구분 주의!)
    • ❗ 스윙과 AWT 컴포넌트는 동시에 사용 불가하다. 서로 다른 구조로 구현되어 있기 때문.

스윙 GUI 응용프로그램 샘플

  • 스윙 컴포넌트들 - JFrame, JButton, JLabel, JTextField, JMenuBar, JComboBox, JScrollPane, JList, JSplitPane, JToolBar, JMenu...

2️⃣ 자바의 GUI 패키지

GUI 패키지 계층 구조

AWT와 스윙 패키지의 주요 클래스의 상속 관계는 다음과 같다.

  • 모든 GUI 컴포넌트들은 Object 클래스(최상위 클래스)의 Component 클래스를 반드시 상속받는다.
자바 서브프레임 종료 - jaba seobeupeuleim jonglyo

컨테이너와 컴포넌트

  • 컨테이너는 컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트이다.
    • 모든 컴포넌트는 java.awt.Component를 상속받기 때문에 컨테이너 또한 컴포넌트이다. 따라서 컨테이너도 다른 컨테이너에 포함될 수 있다.
  • 컴포넌트는 컨테이너와 달리 다른 컴포넌트를 포함할 수 없고, 반드시 컨테이너에 포함되어야 비로소 화면에 출력될 수 있는 GUI 객체이다.
  • 최상위 컨테이너는 다른 컨테이너에 속하지 않고도 독립적으로 존재하여 출력될 수 있는 컨테이너이다. (Top Level Container)
    • JLabel, JDialog, JApplet 등이 있다.
자바 서브프레임 종료 - jaba seobeupeuleim jonglyo

3️⃣ 스윙 GUI 프로그램 만들기

스윙 응용프로그램을 만들기 위한 과정은 다음과 같다.

  1. 스윙 프레임 작성
  2. main() 메소드 작성 (객체를 생성해서 프레임 생성하기)
  3. 스윙 프레임에 컴포넌트 붙이기

1. 스윙 프레임 작성

스윙 프레임과 컨텐트팬

  • 스윙 프레임은 모든 스윙 컴포넌트들의 최상위 컨테이너이다. 이 프레임이 출력될 때 프레임에 부착된 모든 컴포넌트들이 화면에 출력된다.
    • 중요한 내용이라 계속 반복하자면, 컴포넌트들은 프레임 없이 독립적으로 화면에 출력될 수 없다.
  • 스윙 프레임이자 최상위 컨테이너가 바로 JFrame이다.
  • 컨텐트팬은 메뉴를 제외한 모든 GUI 컴포넌트들을 부착하는 공간으로, 화면에 출력하고자 하는 모든 GUI 컴포넌트들을 컨텐트팬에 붙여야 한다.

프레임 만들기, JFrame 클래스 상속

  • ❗ 스윙 응용프로그램의 프레임은 JFrame을 상속받아 만든다.
  • public class MyFrame extends JFrame { ............... }
  • MyFrame 객체는 스윙 프레임의 역할을 한다.
  • 그리고 MyFrame() 생성자에 프레임의 크기와 타이틀을 설정한다.
setTitle("300x300 스윙 프레임 만들기"); setSize(300, 300); setVisible(true);

스윙 응용프로그램에서 main() 메소드

  • 스윙 응용프로그램에서 main()의 기능은 최소화하는 것이 좋다.
  • (보통) 스윙 프레임을 생성하는 아래 코드 정도만 main() 메소드에서 구현한다.
public static void main(String[] args) { MyFrame frame = new MyFrame(); // 스윙 프레임 생성 }

2. 프레임에 컴포넌트 붙이기

타이틀 달기

  • super()를 이용하여 JFrame의 생성자를 호출하거나,
  • JFrame의 setTitle() 메소드를 이용한다.
public MyFrame() { //생성자 super("타이틀 문자열"); }
public MyFrame() { //생성자
    setTitle("타이틀 문자열");
}

컨텐트팬에 컴포넌트 달기

  • ❗ 스윙에서는 컨텐트팬(content pane)에만 컴포넌트를 부착할 수 있다.
    • 컨텐트팬은 JFrame 객체가 처음 생길 때 자동으로 생성된다.
    • 이 컨텐트팬을 알아내기 위해서는 JFrame 클래스의 getContentPane() 메소드를 호출한다.
    • 이때 컨텐트팬은 Container 타입이다.
public class MyFrame extends JFrame {
    public MyFrame() {
        ...
        Container c = getContentPane();
        ...
    }
}
  • 이제 add() 메소드를 이용하여 컨텐트팬에 컴포넌트를 붙일 수 있다.
JButton btn = new JButton("Click!"); c.add(btn);

스윙 응용프로그램의 종료

  • 프레임 윈도우의 x 버튼을 눌렀을 때 프로그램까지 종료시키기를 원한다면 다음 코드를 삽입해야 한다.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);