본문 바로가기
JAVA

19. GUI

by 김마리님 2020. 4. 20.

인터페이스에 그래픽을 더한 것을 GUI(graphic user interface)라고 한다. 우리가 흔히 아는 cmd dos 창은 한 줄로서 명령하게 되므로 이는 CLI(commend line interface)라고 한다. 우리가 아는 윈도우 등은 다 GUI이다.

이 GUI를 만들 때는 모니터의 가장 왼쪽 위를 0,0 좌표로 시작하여 좌표에 점을 찍어 그림을 완성한다. 이렇게 점이 선이 되고, 선이 그래픽이 된다.

 

만들어둔 기능은 클래스화 시킨다. 클래스화 시켜서 재사용 시 이를 상속하고 오버라이딩 한다.

컴포넌트는 다른 os에서는 위젯이라고도 하는데, 이벤트가 발생할 때 반응하는 것을 이야기 한다. 종류에는 button, Tex

컴포넌트를 넣는 것을 컨테이너라고 하는데, 컨테이너는 HTML의 body와 비슷하다. 컨테이너에는 두 가지가 있는데

Frame=body

Panel=div

와 유사하다.

ScrollPane은 이 컨테이너들에 스크롤 기능을 추가해 더 큰 컨테이너를 만드는 것이다.

우리가 쓰게 될 Jframe과 ContentPage,Component는 다음과 같다.

우리는 컴포넌트들을 구현하기 위해 contentpane에 접근할 필요성이 있다.

 

자바는 기본적으로 보더 레이아웃(borderlayout)을 따른다. 이 레이아웃은 동 서 남 북, 중앙을 정해놓고 그 영역을 가득채우기 때문에 버튼을 만들어도 구역을 모두 차지한다. 따라서, 다양한 레이아웃이 있는데, 그 레이아웃에 따라 변한다. 보더를 제외하고도 다음과 같은 것도 있다.

flowlayout : 물흐르듯이 왼쪽->오른쪽으로 컴포넌트를 배치함

gridlayout : 컨테이너를 테이블처럼 구획을 나누어 컴포넌트를 배치함.

레이아웃이 없이 진행되는 것도 있는데, 이 경우 컴포넌트를 배치할 좌표를 일일히 배치해야한다.

 

우리가 사용하는 GUI 들은 모두 OS에 속해있다. OS의 리스너가 이벤트를 감시하는데, 이벤트가 발생할 때 운영체제가 리스너로 감지하고 코드를 윈도우에 등록한다. 이 후 JVM에게 콜백하여 버튼이 눌렸다는 것을 알려준다. 이 때, 모든 컨텍스트를 이벤트 분배 스레드에 전달하게 되고, 이 스레드가 타겟 클래스에 콜백한다.

 

이것이 가장 기본적인 GUI코드이다.

이 때, ContentPane을 통해 접근해야한다는 점을 잊지 말자.

package ch09;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SwingEx01 extends JFrame{
	public SwingEx01(){
		//JFrame의 기본 패널에 접근하기.
		Container contentPane = getContentPane();
		//버튼 그리기
		contentPane.add(new JButton("첫 번째 버튼"));
		//제목 정하기
		setTitle("300x300 스윙 프레임 만들기");
		//화면 크기 정하기
		setSize(300,300);
		//화면에 보이게 하기.
		setVisible(true); //painting ; 내부에서 그림을 그림
	}
	public static void main(String[] args) {
		new SwingEx01();
	}
}

이렇게 일반적인 border 레이아웃 같은 경우 화면에 가득 차는데, 이를 flowlayout으로 바꿔보자.

 

package ch09;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SwingEx01 extends JFrame{
	public SwingEx01(){
		//JFrame의 기본 패널에 접근하기.
		Container contentPane = getContentPane();
		//JFrame의 기본 패널은 borderlayout -> flow로 변경
		contentPane.setLayout(new FlowLayout());
		//버튼 그리기
		contentPane.add(new JButton("첫 번째 버튼"));
		//제목 정하기
		setTitle("300x300 스윙 프레임 만들기");
		//화면 크기 정하기
		setSize(300,300);
		//화면에 보이게 하기.
		setVisible(true); //painting ; 내부에서 그림을 그림
	}
	public static void main(String[] args) {
		new SwingEx01();
	}
}

이렇게 가득 채우지 않고 화면에 버튼처럼 나타나게 된다.

 

이제 그래픽에서 가장 익숙한 것 중 하나인 배경색을 바꿔보자.

package ch09;

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

public class SwingEx02 extends JFrame{
	public SwingEx02() {
		setTitle("ContentPane과 JFrame");
		//프레임 윈도우를 닫으면 프로그램이 종료
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//컨텐트팬을 알아낸다
		Container contentPane=getContentPane();
		//컨텐트팬 색을 오렌지 색으로
		contentPane.setBackground(Color.orange);
		//flowlayout 배치관리자로 변경
		contentPane.setLayout(new FlowLayout());
		
		contentPane.add(new JButton("OK"));
		contentPane.add(new JButton("Cancel"));
		contentPane.add(new JButton("Ignore"));
		
		setSize(300,150);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new SwingEx02();

	}

}

Object.setbackground를 통해 배경색을 변경할 수 있다.

이 때, 코드의 12번째 줄 즈음에, setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 라는 코드가 보이는데, 이 명령어를 사용하지 않으면 GUI를 닫아도 프로세스가 종료되지 않고 계속 켜져있으므로, 코드를 넣어주자.

 

다음은 코드에 대한 다양한 레이아웃 예시이다.

1. border layout

package ch09;

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

public class BorderLayoutEx extends JFrame{
	public BorderLayoutEx() {
		setTitle("borderlayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		c.setLayout(new BorderLayout(30,20));
		c.add(new JButton("add"),BorderLayout.NORTH);
		c.add(new JButton("sub"),BorderLayout.SOUTH);
		c.add(new JButton("mul"),BorderLayout.EAST);
		c.add(new JButton("div"),BorderLayout.WEST);
		c.add(new JButton("calculate"),BorderLayout.CENTER);
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new BorderLayoutEx();
	}
}

 

2. Flow Layout

package ch09;

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

public class FlowLayouyEx extends JFrame{
	public FlowLayouyEx() {
		setTitle("FlowLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		c.setLayout(new FlowLayout(FlowLayout.LEFT,30,40));
		c.add(new JButton("add"));
		c.add(new JButton("sub"));
		c.add(new JButton("mul"));
		c.add(new JButton("div"));
		c.add(new JButton("calculate"));
		
		setSize(300,200);
		setVisible(true);
		
	}
	public static void main(String[] args) {
		new FlowLayouyEx();
	}
}

 

3. grid layout

package ch09;

import java.awt.*;

import javax.swing.*;

public class GridLayoutEx extends JFrame{
	public GridLayoutEx() {
		setTitle("GridLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//4x2 배치관리자 생성
		GridLayout grid=new GridLayout(4,2);
		grid.setVgap(5); //격자 사이 간격 5픽셀
		
		Container c=getContentPane();
		c.setLayout(grid); //만들어둔 grid를 배치관리자로 지정
		c.add(new JLabel("이름"));
		c.add(new JTextField(""));
		c.add(new JLabel("학번"));
		c.add(new JTextField(""));
		c.add(new JLabel("학과"));
		c.add(new JTextField(""));
		c.add(new JLabel("과목"));
		c.add(new JTextField(""));
		
		setSize(300,200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new GridLayoutEx();
	}

}

4. 배치관리자가 없는 컨테이너

 

배치관리자가 없이 컨테이너를 만들기도 한다. 이 때는 특별한 배치관리자가 없기 때문에, 컴포넌트들이 자유자재로(?) 흩어진다. 따라서 좌표를 이용하여 일일히 컴포넌트를 배치해줘야 하는데, 이를 간단하게 해결할 수 있는 확장프로그램이 있다.

window-eclipsemarketplace 에서 window builder을 찾아 설치해보자.

 

이 프로그램을 이용하는 방법은 다음과 같다.

다음과 같이 접근해보자.

 

다음 스윙 디자이너에서 애플리케이션 윈도우로 들어간다.

다음 이름을 설정하고 끝낸다.

잘 만들었다면, (패키지를 설정하지 않은 경우) 다음과 같은 곳에서 만든 파일을 찾을 수 있다.

아래의 탭에 design 탭을 눌러보자.

레이아웃을 절대배치(Absolute layout)으로 두고, JLable을 선택 하면 프레임 위로 마우스로 배치할 수 있게 된다. 이렇게 배치가 되면 소스페이지에서도 유동적으로 변화한다.

 

이 소스 코드에서도 변경하면 마찬가지로 디자인 탭의 값이 변화하게 된다.

 

반응형

'JAVA' 카테고리의 다른 글

jsoup를 이용한 언론사 크롤링하기  (0) 2020.08.14
20. 이벤트  (0) 2020.04.20
18. 소켓 통신  (0) 2020.04.14
17. 멀티 스레드  (0) 2020.04.13
16. 익명 클래스  (0) 2020.04.13