ABOUT ME

읽히는 로직을 구현하고 싶습니다.

Today
Yesterday
Total
  • GUI / Layout / awt/ 컴포넌트 / 컨테이너 개념정리
    JAVA/멀티스레드, 이벤트 2024. 5. 23. 12:33

    ✔ GUI(Graphical User Interface)

    목적

    사용자에게 이해하기 쉬운 모양의 정보를 제공한다.

    사용자가 편리하게 입출력을 할 수 있는 그래픽 화면으로 구성하고 입출력 장치를 통해 입력받을 수 있도록 지원하는 사용자 인터페이스이다.

     

    자바 GUI 특징

    • GUI 프로그래밍이 쉽다.
    • GUI 컴포넌트를 제공한다.

     

    ✏️  자바 GUI 프로그래밍

    GUI 컴포넌트와 그래픽을 이용

    • AWT :  java.awt 패키지
    • Swing : javax.swing 패키지

     

    ✔ AWT(Abstract Windowing Toolkit)

    자바가 처음 나온 시기 함께 배포된 GUI 라이브러리이다.

    • GUI 프로그래밍(윈도우 프로그래밍)을 위한 도구이다.
    • AWT컴포넌트의 최상위 조상은 java.awt.Component 클래스(메뉴 관련 컴포넌트 제외)이다.
    • native 운영체제의 gui 컴포넌트의 도움을 받기 때문에 처리 속도는 빠르지만 운영체제에 부담이 많이 간다.
    • java로 구현하지 않고 OS의 컴포넌트를 그대로 사용한다.
    • 즉, os에 종속적이다. 만들기 쉽지만 무겁다.

     

    ✔ Swing

    • AWT 기술 기반으로 순수 자바 언어로 만들어진 라이브러리이다.
    • AWT 기술 + 고급 컴포넌트
    • native OS에 의존적이지 않다.
    • 만들기는 어렵지만 가볍다.

    Swing 특징

    • 클래스 이름이 J로 시작한다.
    • JComponenet를 상속받는 클래스이다. (인스턴스 생성(new)이 불가능)
    • AWT의 Container를 상속받는 클래스(JApplet, JDialog, JFrame ..등)이다.

    * JComponent : 스윙 컴포넌트의 공통 속성을 구현한 추상 클래스를말한다. 

     

     

     컴포넌트(Component)

    모든 컴포넌트의 최상위 조상은 java.awt.Component 클래스 (메뉴 관련 컴포넌트 제외)

    모든 스윙 컴포넌트는 javax.swing.JComponenet를 상속받는다.

    컨테이너에 포함되어야 화면에 출력될 수 있는 GUI 객체이다.

     

    🔧 AWT 컨포넌트 별 발생 이벤트

     

     컨테이너(Container)

    • 다른 GUI 컨포넌트를 포함할 수 있는 컴포넌트를 말한다.
    • java.awt.Container 상속받는다.
    • 다른 컨테이너에 포함될 수 있다.
    • 최상위 컨테이너는 독립적 출력이 가능하다.
    • AWT 컨테이너 : panel, Frame, Applet, Dialon, Window
    • add()를 사용해서 추가한다.

    awt 예제

    📝 layoutManager 배치 관리자

    컨테이너 안에 추가되는 컴포넌트의 위치와 크기를 자동적으로 결정한다.

    • Frame : BorderLayout(Window, Dialon, Frame)이 기본이다.
    • Panel : FlowLayout(panel, applet)이 기본이다.

    [종류]

    - FlowLayout

    위드 프로세서와 같이 맞춤 정렬이 가능하다. 기본 생성자(  )는 가운데 정렬, 상하 좌우 5픽셀로 설정되어 있다.

    • 컨포넌트들을 왼쪽에서 오른쪽으로 배치한다.
    • 너비를 벗어날 경우 다음 줄에서 다시 배치를 시작한다.
    • Panel과 awt.Applet의 디폴트 배치 관리자이다.

    - BorderLayout

    • Frame, Japplet, 대화 상자.. 등 최상위 컨테이너의 디폰트 배치 관리자이다.
    • 컴포넌트들이 상하좌우중간에 배치된다.
    • 같은 위치에 컴포넌트들이 추가되면 앞의 컴포넌트는 보이지 않는다.

    정렬을 안한 경우

    - GridLayout

    • 컴포넌트를 열과 행으로 관리한다.
    • 모든 컴포넌트들의 크기는 같게 되며 컴데이너의 모든 공간은 컴포넌트로 채워진다.

    - BoxLayout

    • 컴포넌트를 하나의 행이나 열로 배치한다.
    • box를 쌓는 모양으로 정렬된다.

     

    💻 코드로 보기

    Frame에서는 한글이 깨진다. 영어를 사용하

     

    package packGUI;
    
    import java.awt.Button;
    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.GridLayout;
    import java.awt.Label;
    import java.awt.Panel;
    import java.awt.TextField;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class Ex43FrameLayout extends Frame {
    	Panel pn1 = new Panel(); // 컨테이너(visual Object)을 담는 일종의 그릇
    	
    	TextField txtBun, txtirum;
    	Button btnGo;
    	
    	public Ex43FrameLayout() {
    		// 배치 관리자로 화면 디자인 연습
    		setLayout(new GridLayout(2,1)); //Frame의 Layout을 변경(BorderLayout > GridLayout) 21// 첫번째 행 디자인
    		Label lbl1 = new Label("bunho: "); // 메시지 컴포넘트(부품,객체)
    		txtBun = new TextField("10",20); //키보드로 자료 입력이 가능한 컴포넌트
    		pn1.add(lbl1); // panel에 Label 객체 담기
    		pn1.add(txtBun); // panel에 TextField 객체 담기
    		pn1.setBackground(Color.YELLOW); // 패널 배경색 변경
    		super.add(pn1); //frame에 panel을 담은것
    		
    		// 두번째 행 디자인
    		super.setTitle("레이아웃 연습");
    		super.setBounds(200, 200, 400, 300);
    		super.setVisible(true);
    		
    		super.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		});
    	}
    	
    	public static void main(String[] args) {
    		new Ex43FrameLayout();
    
    	}
    
    }

     

     

     

     

    화면의 크기에따라 구성이 변한다.

    public class Ex43FrameLayout extends Frame implements ActionListener{
    	Panel pn1 = new Panel(); // 컨테이너(visual Object)을 담는 일종의 그릇
    	Panel pn2 = new Panel();
    	Panel pn3 = new Panel();
    	Panel pn4 = new Panel();
    	Panel pn5 = new Panel();
    	Panel pn6 = new Panel();
    	
    	TextField txtBun, txtirum;
    	Button btnGo;
    	CardLayout card = new CardLayout();
    	
    	public Ex43FrameLayout() {
    		setLayout(new GridLayout(2,1)); //Frame의 Layout을 변경(BorderLayout > GridLayout) 21// 첫번째 행 디자인
    		Label lbl1 = new Label("bunho: "); // 메시지 컴포넘트(부품,객체)
    		txtBun = new TextField("10",20); //키보드로 자료 입력이 가능한 컴포넌트
    		pn1.add(lbl1); // panel에 Label 객체 담기
    		pn1.add(txtBun); // panel에 TextField 객체 담기
    		pn1.setBackground(Color.YELLOW); // 패널 배경색 변경
    		//super.add(pn1); //frame에 panel을 담은것
    		
    		Label lbl2 = new Label("irum: "); 
    		txtirum = new TextField("이기자",30);
    		pn2.add(lbl2);
    		pn2.add(txtirum);
    		pn2.setBackground(Color.CYAN);
    		
    		pn3.setLayout(card); // FlowLayout > CardLayout
    		pn3.add("first",pn1); //pn3에 first라는 이름으로 pn1을 담은 것
    		pn3.add("second",pn2); // 카드처럼 겹쳐있음
    		btnGo = new Button("ok");
    		btnGo.addActionListener(this); //버튼 이벤트 감지
    		
    		pn4.add(pn3); //pn4 : flowLayout (pn3은 pn1과pn2를 가지고있음)
    		pn4.add(btnGo);
    		add(pn4); //panel4를 담은 것
    		
    		// 두번째 행 디자인
    		pn5.setLayout(new BorderLayout()); //FlowLayout > BorderLayout
    		pn5.setBackground(new Color(123,123,123));
    		pn5.add("East",new Label("kbs"));
    		pn5.add("West",new Label("mbc"));
    		pn5.add("South",new Label("sbs"));
    		pn5.add("North",new Label("tvn"));
    		pn5.add("Center",new Label("ytn"));
    		
    		add(pn5);
    		
    		super.setTitle("레이아웃 연습");
    		super.setBounds(200, 200, 400, 300); //스테이징
    		super.setVisible(true);
    		
    		super.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		});
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// 버튼 이벤트 처리 메서드
    		//버튼을 클릭하면 pn1과 pn2를 교체
    		//System.out.println("good");
    		//System.out.println(e.getActionCommand());
    		if(e.getActionCommand().equalsIgnoreCase("ok")) {
    			btnGo.setLabel("go");
    			card.show(pn3, "second"); //pn3에 담긴 pn2를 보여줘
    		}else {
    			btnGo.setLabel("ok");
    			card.show(pn3, "first"); //pn3에 담긴 pn1를 보여줘
    		}
    	}
    	
    	public static void main(String[] args) {
    		new Ex43FrameLayout();
    
    	}
    
    }

    😊정리

    Frame을 사용해서 윈도우레이아웃을 연습해봤다.

    panel, 컴포넌트 .. 등 익숙하지 않은 단어들이 많이 나왔다.

    디자인에 신경쓰지 않아도 된다.

    코드의 흐름에 더 신경쓰자.

    이번 개념을 바탕으로 이벤트의 다양한 코드들을 확인 할 것이다.

     

     

    [참조 사이트]

    https://m.blog.naver.com/so_yuns/222172786073

     

    [Java] 자바 GUI / Layout 종류 / 수동배치

    ■ 배치관리자 (Layout Manager) - awt 패키지에서 사용 - FlowLayout, BorderLayout, GridLayout,...

    blog.naver.com

     

Designed by Tistory.