지금까지 콘솔창에서 실행되는 프로그램을 만들어봤는데, 실제로는 위의 그림과 같이 윈도우창으로 사용하는 프로그램 형태를 훨씬 더 많이 사용하게 됩니다. 위의 창과 같은 기본 윈도우를 띄우는 프로그램 소스는 다음과 같습니다.

import java.awt.*;
import javax.swing.*;

class WinEx1 {
	public static void main(String[] args) {
		JFrame f= new JFrame("Title");
		
		f.setLocation(350, 300);	//가로, 세로 위치에 윈도우 배치
		f.setPreferredSize(new Dimension(200,200));
		//Frame f= new Frame("Title");	//종료 이벤트를 따로 구성해줘야한다.
		Container contentPane = f.getContentPane();
		JLabel label = new JLabel("Test Program", SwingConstants.CENTER);
		contentPane.add(label);
				
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //close버튼에 따른 액션
		// ↓윈도우를 디스플레이한다
		f.pack();
		f.setVisible(true);
		
		
		
	}
	
}

 

프레임은 Frame으로 사용할수도  있고 JFrame으로 사용할수도 있는데, 보통 JFrame을 더 많이 사용하게 됩니다. 둘의 가장큰 차이점은 윈도우창의 X버튼을 눌렀을때 JFrame은 창이 사라지지만, Frame은 종료이벤트를 따로 구성해줘야 한다는 것입니다.

 

setLocation(좌표,좌표)는 윈도우창을 처음 어느 위치에 띄울것인지 정하는 메소드입니다. 왼쪽 맨 위를 0,0으로 생각하고 지정하면 됩니다.

 

setPreferredSize()는 윈도우창 크기를 정하는 메소드인데, 이 메소드는 Dimension 타입의 파라미터만 받기때문에 Dimension객체를 만들어서 넘겨줘야합니다.

 

JLable을 이용해서 라벨을 만듭니다.

 

ContentPane()을 만들고, contentPane.add()을 이용해서 라벨을 content pane위에 올려놓습니다.

 

pack()을 이용해서 프레임에 부속된 컴포넌트들의 크기를 맞게 조정하고 setVisible(true)로 프레임을 보여줍니다.

 

GUI프로그래밍을 하기 위해서는 이러한 기본틀을 이해하고 외워두는것이 중요합니다.

 

.

 

아래 그림은 좀 더 이해하기 쉽게 그림으로 그려놓은 것입니다.

 

 

 

 

 

 

Text입력란과 확인버튼을 추가한 위와같은 프로그램을 만들어보겠습니다.

 

 

import java.awt.*;
import javax.swing.*;

class WinEx2 {
	public static void main(String[] args) {
		JFrame f= new JFrame("Hello, Java Program");
		
		f.setLocation(500, 400);	//가로, 세로 위치에 윈도우 배치
		f.setPreferredSize(new Dimension(200,80));
		//Frame f= new Frame("Title");	//종료 이벤트를 따로 구성해줘야한다.
		Container contentPane = f.getContentPane();
		JTextField text = new JTextField();
		JButton button = new JButton("확인");
		JLabel label = new JLabel("Test Program");
		
		contentPane.add(text,BorderLayout.CENTER);
		contentPane.add(button,BorderLayout.EAST);
		contentPane.add(label,BorderLayout.SOUTH);
		
		
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //close버튼에 따른 액션
		// ↓윈도우를 디스플레이한다
		f.pack();
		f.setVisible(true);
	}
}

현재 프로그램에서 text란에 값을 입력하고 확인버튼을 눌러도 아무런 변화가 없습니다.

무언가 변화(Event)를 주려면 Action에 관한 클래스를 만들어줘야합니다.

 

Acion을 실행하는 class를 만들때, 반드시 ActionListener 인터페이스를 상속받아야하고, Action에 사용할 모든 값을 생성자에서 받아와야합니다.

 

 

 

위와 같이 값을 입력하면 label에 Hello. 값 이 나오는 프로그램을 만들어보겠습니다.

 

main메소드가 있는 WinEx1.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class WinEx2 {
	public static void main(String[] args) {
		JFrame f= new JFrame("Hello, Java Program");
		
		f.setLocation(500, 400);	//가로, 세로 위치에 윈도우 배치
		f.setPreferredSize(new Dimension(200,80));
		//Frame f= new Frame("Title");	//종료 이벤트를 따로 구성해줘야한다.
		Container contentPane = f.getContentPane();
		JTextField text = new JTextField();
		JButton button = new JButton("확인");
		JLabel label = new JLabel("Test Program");
		
		contentPane.add(text,BorderLayout.CENTER);
		contentPane.add(button,BorderLayout.EAST);
		contentPane.add(label,BorderLayout.SOUTH);
		
		ActionListener listener = new ConfirmActionListener(text,label);// Action클래스를 생성합니다
		button.addActionListener(listener); //버튼을 눌렀을 때, 이벤트를 발생합니다.
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //close버튼에 따른 액션
		// ↓윈도우를 디스플레이한다
		f.pack();
		f.setVisible(true);
	}
}

Action이 들어가있는 클래스(ConfirmActionListener.java)

import java.awt.event.*;
import javax.swing.*;

class ConfirmActionListener implements ActionListener {
	JTextField text;
	JLabel label;
	
	//생성자로 이벤트에 사용할 모든 값을 받아온다
	ConfirmActionListener(JTextField text, JLabel label){
		this.text=text;
		this.label=label;
	}
	
	@Override
	//ActionListener 인터페이스를 implements할 때 오버라이딩해야하는 메소드
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		String name = text.getText();
		label.setText("Hello. "+name);

	}

}

 

 

Action이 발생해서 label값이 바뀌는 과정은 아래 그림과 같습니다.

 

WinEx1.java에서 text값과 label값을 주소값으로 값을 저장하고, ConfirmActionListener.java에서도 주소값을 따라 들어가서 값을 바꿔주기 때문에, 입력한 값으로 출력됩니다.