자바 JFrame은 AWT의 Frame 클래스를 계승하는 컨테이너다. 무슨 말이냐면 메인 윈도우창 같은 것이다. 메인 윈도우창 안에는 레이블, 버튼, 텍스트 필드 등의 컴포넌트 (기계로 따지면 부속품)들을 담고 있다.

 

JFrame

지금 보고있는 인터넷브라우저도 윈도우창이다. 웹은 GUI보다 훨씬 더 진보한 상태지만 의외로 기본 GUI 형태가 남아있다. 사람의 UI라는 건 2D화면에선 어딜가나 비슷한 것이다. 예를 들어 구글의 검색창은 TextField 컴포넌트와 같은 형태다. 버튼도 같다. 물론 구글이 더 COOL한 스타일이지만 사용자의 조작법이나 기본 생김새(?)는 같다.

 

구글 검색창

 

텍스트필드와 버튼

그동안 포스트에서 class 클래스네임 extends JFrame을 사용해왔다. JFrame 을 상속받은 클래스는 그 자체가 윈도우GUI인 것이다. 이벤트처리기는 인터페이스만 구현해 주면 된다. 이렇게 간단한 몇줄의 코드만으로도 윈도우창을 만드는 것이 가능하다.

 

아래 소스코드는 좀 길지만 JFrame , JComponent, JPanel 에 대한 예제이다.

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

class MyCanvas extends Canvas{
	
	public void paint(Graphics g) {
		g.setColor(new Color(255,153,51));
		g.fillRect(250, 300, 150, 200);
		g.drawOval(300, 100, 100, 70);
		g.setColor(new Color(0,51,204));
		g.fillOval(450, 100, 100, 90);
		g.drawArc(550, 100, 140, 80,90,60);
		g.fillArc(550, 250, 140, 80,90,60);
		
	}
}

class ComponentEX extends JComponent{
	public void paint(Graphics g) {
		g.setColor(new Color(51,255,0));
		g.fillRect(250, 100, 150, 200);
	}
}

public class SwingEX16 {
	
	
	SwingEX16(){
		
		JFrame frame1 = new JFrame();
		JPanel panel1 = new JPanel();
		ComponentEX com1 = new ComponentEX();
		MyCanvas canvas1 = new MyCanvas();
		
		panel1.setLayout(new FlowLayout());
		panel1.setBounds(50,100,150,200);
		panel1.setBackground(new Color(0,153,255));
		
		JLabel label1 = new JLabel("JLabel Example");
		JButton button1 = new JButton("Nice Click!");
		JButton button2 = new JButton("GOOD Click!");
		button1.setBackground(new Color(255,153,255));
		button2.setBackground(new Color(255,204,000));

		panel1.add(label1);
		panel1.add(button1);
		panel1.add(button2);
		frame1.add(panel1);
		frame1.add(com1);
		//frame1.add(canvas1);
		
		//frame1.setLayout(null);
		frame1.setBounds(300, 300, 700, 700);
		frame1.setTitle("JFrame");
		frame1.setVisible(true);
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new SwingEX16();
	}
}

실행결과

JFrame의 기본 메소드들은 초기화를 위한 것이다. setBounds , setTitle, setVisible 등 별로 바뀔일이 없다. 윈도우의 초기 위치와 크기 정도는 setBounds로 바꿀만 하다. setBounds 메소드는 모든 컴포넌트들에게 공통사항이다. 초기화를 시키지 않아도 동작은 하지만 정확한 결과를 얻기 위해서는 초기화를 시켜야 한다. Absolute Layout 절대좌표 레이아웃에서는 필요하다. setLayout(null) 하는 것이 바로 절대좌표이다.

 

JComponent 클래스는 JButton이나 다른 컴포넌트의 상위클래스이다.

 

스윙 계층도

JFrame 상에 구현할 수 있다. 컨테이너(상위클래스)에 이들 컴포넌트를 추가할 수 있다. 예제에서는 그래픽을 처리한다. 컴포넌트 자체는 버튼이나 레이블처럼 특정한 형태가 없지만 그래픽을 처리하는 것은 가능하다. 버튼이나 레이블 같은 클래스도 컴포넌트를 연장(extends)한 것이다. 단지 특정의 형태로 그래픽과 기본 이벤트처리를 구현한 것이다. 따라서 컴포넌트에서 처리할 수 있는 것은 그래픽이다.

 

Canvas 컴포넌트는 Component 를 연장(extends)한다. Canvas는 말 그대로 도화지 같은 것이다. Component에서 그래픽을 처리할 수 있다면 Canvas는 그래픽 처리 목적의 이름을 지어버렸다. Canvas에 그림판 같은 앱을 만들 수 있다. 예제에서는 frame1.add(canvas1); 의 주석을 풀어주면 볼 수 있다. (컴포넌트의 그래픽을 다시 그린다)

 

Canvas 예제

 

JPanel은 JFrame 밑에 들어간다. 자기가 컴포넌트이면서 컴포넌트들를 포함한다. 레이아웃 배치 등 컴포넌트들의 관리를 수월하게 해준다. 예제에서 보는 것 처럼 다른 컴포넌트들(버튼, 레이블)은 JPanel을 기준으로 setBound 배치한다. 별도의 레이아웃 관리를 한다. 이 경우 JPanel을 포함하는 JFrame에서는 setLayout 을 꺼줘야 한다. 컴포넌트들의 포함관계에서는 포함되는 관계가 있는 클래스들 간 세팅에 신경을 써줘야 한다.

 

 

 

 

 

*자바 스윙 계층도

 

Java Swing Tutorial - javatpoint

Java Swing Tutorial with example of JButton, Difference between AWT and swing, simple java swing example, example of swing by inheritance, JRadioButton, JTextField, JTextArea, JList, JColorChooser classes that are found in javax.swing package.

www.javatpoint.com

공유하기

facebook twitter kakaoTalk kakaostory naver band