본문 바로가기

JAVA 공책/수업 메모

GUI 프로그램을 하는 방법



java에서 GUI(Graphic User Interface - 윈도우즈) 프로그램을 하는 방법



  • 1. AWT: 운영체제의 자원을 빌려서 사용
    • 느리고 무겁기 때문에 잘 사용하지 않음
    • Swing 이나 Android의 기반이 되기 때문에 주로 학습용으로 사용

  • 2. Swing: JVM의 자원을 이용해서 사용
    • AWT 보다는 가벼움
    • AWT 보다 다양한 컴포넌트를 지원
    • AWT 와 동일한 방식으로 프로그래밍
  • 3. Java FX
    • 가장 최근에 지원하기 시작한 GUI 프로그래밍
    • 다양한 UI를 제공
    • Swing 보다는 프로그래밍 하기가 까다로움




AWT


  • Frame
    • 하나의 윈도우에 해당하는 클래스
    • 이 클래스의 인스턴스를 만들면 하나의 윈도우가 만들어집니다.
    • 기본적으로 좌표는 0,0 이고 크기는 0,0 이며 화면이 보이지 않도록 설정되어 있습니다.
    • 그래서 크기와 화면 출력 설정을 해주어야 합니다.
    • 프레임을 상속받은 클래스를 만들고 이 클래스의 생성자에서 기본 설정을 하고 메인에서 인스턴스를 생성해서 화면에 출력하는 형식을 따릅니다.

  • panel
    • 여러 rodml Compoonent 들을 하나로 묶어주기 위해 사용하는 컨테이너
    • 독자적으로 출력을 할 수 없기 때문에 Frame이나 다른 Panel의 위에 배치되서 화면에 출력됩니다.
    • 컴포넌트 위에 배치할 때는 add(배치할 컴포넌트) 메소드를 이용합니다.

  • Dialog(대화상자)

  • 1) 종류
    • Model Dialog: 대화상자가 출력되면 다른 컴포넌트에게 제어권을 옮길 수 없는 형식으로 코드 실행도 중단됩니다.
대화상자를 화면에서 제거해야만 다른 컴포넌트를 사용할 수 있고 코드도 수행됩니다.

    • Modeless Dialog: 대화상자가 출력된 상태에서도 다른 컴포넌트에게 제어권을 옮길 수 있는 형식의 다이얼로그

  • 2) 대화상자를 생성할 때는 생성자의 첫번째 매개변수에 자신의 부모 컴포넌트의 주소를 대입해야 합니다.

  • Button
    • 마우스로 클릭해서 작업을 수행하는 컴포넌트
    • 기본적으로 글자도 보여주지만, 윈도우 기반으로 작동하기 때문에 ms949 형식으로 바꾸어 주어야 합니다.

  • Checkbox
    • 체크 박스와 라디오 버튼을 만들 수 있는 클래스
    • 체크 박스는 하나도 선택하지 않을 수 있고, 여러 개를 선택 할 수도 있습니다.
    • 라디오 버튼은 반드시 1개를 선택해야 할 때 사용합니다.
    • 따라서 라디오 버튼을 만들 때는 디폴트를 설정해 주어야 합니다.
    • 만들 때 생성자의 두번째 매개변수로 CheckboxGroup 인스턴스를 대입하면 라디오 버튼이 됩니다.
    • 라이오 버튼은 3개가 넘어가면 잘 안 쓴다.(항목의 개수가 너무 많아서)

  • Choice
    • ComboBox라고 많이 불린다.
    • 여러 개의 항목 중 하나의 항목만 선택하도록 하고자 할 때 사용하는 Component로 RadioButton과 유사한 역할을 하는 Component

  • Label
    • 텍스트를 출력하기 위한 Component

  • List
    • 여러 개의 항목을 보여주고 그 중 하나 또는 여러 개를 선택 할 수 있도록 해주는 Component



**오늘 중요 학습목표**

  • 스레드를 만들어서 실행 할 수 있다.
  • anonymous class 로 만들어서 실행 할 수 도 있다. (anonymous class로 만드는 이유, 장점 등)
  • Frame을 이용해서 윈도우 화면을 만들고 출력 할 수 있다.
  • Button, Label, Checkbox, RadioButton(Checkbox), ComboBox(Choice), ListBox(List)의 용도


package guiEx1;

import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;

public class GuiEx1 extends Frame {
    // 생성자

    public GuiEx1() {

        /*
         * Dialog dialog = new Dialog(this, "대화상자"); // dialog.setTitle("대화상자");
         * dialog.setSize(100, 100);
         */

        this.setBackground(Color.ORANGE);
        setSize(500, 500);
        setLocation(100, 100);
        setTitle("나의 첫번째 윈도우 프로그램");

        Panel panel1 = new Panel();
        Button button = new Button("버튼");
        // 버튼의 배경색을 변경하는 스레드
        // ColorThread th1 = new ColorThread(button); - 클래스 지워도 되지만 공부를 위해서 남겨둠.
        Thread th1 = new Thread() {
            public void run() {
                Color[] colors = { Color.BLACK, Color.blue, Color.CYAN, Color.GREEN };

                int count = 0;
                while (true) {
                    try {
                        Thread.sleep(500);
                        button.setBackground(colors[count % colors.length]);
                        count = count + 1;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        th1.start();
        Button button1 = new Button("버튼");
        // 버튼의 텍스트를 변경하는 스레드
        // TextThread th2 = new TextThread(button1);
        Thread th2 = new Thread() {
            public void run() {
                String[] text = { "버튼", "button", "단추", "클릭" };

                int count = 0;
                while (true) {
                    try {
                        Thread.sleep(500);
                        button1.setLabel(text[count % text.length]);
                        count = count + 1;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        th2.start();

        // add(button); 윈도우 크기로 너무 크게 만들어진다.

        // 버튼 추가
        panel1.add(button);
        button.setLabel("클릭");
        /*
         * button.setBackground(Color.DARK_GRAY); button.setForeground(Color.white);
         * button.setFont(new Font("맑은 고딕", Font.BOLD, 30));
         */

        panel1.add(button1);
        button1.setLabel("누르기");
        /*
         * button1.setBackground(Color.DARK_GRAY); button1.setForeground(Color.white);
         * button1.setFont(new Font("맑은 고딕", Font.BOLD, 30));
         */

        // 패널을 프레임에 추가
        add(panel1);

        setVisible(true);

        /*
         * int sign = 1; while(true) { try { Thread.sleep(1000); if(sign > 0) {
         * button.setBackground(Color.MAGENTA); }else {
         * button.setBackground(Color.LIGHT_GRAY); } sign= -sign; } catch
         * (InterruptedException e) { e.printStackTrace(); } }
         */

    }
}


package guiEx1;
import java.awt.*;
public class ColorThread extends Thread {
       private Button button;
       public ColorThread(Button button) {
               this.button = button;
       }
       public void run() {
               //한정된 값중에서 출력하고 싶을 때는 아래와 같이 배열을 만들어서 배열 길이로 증가값을 나눈 나머지로 출력하면 됩니다.
               Color[] colors = { Color.red, Color.ORANGE, Color.green, Color.BLACK };
               int idx = 0;
               while (true) {
                      try {
                              idx = idx + 1;
                              Thread.sleep(1000);
                              button.setBackground(colors[idx % colors.length]);
                      } catch (InterruptedException e) {
                              e.printStackTrace();
                      }
               }
       }
}

package guiEx1;
import java.awt.Button;
public class TextThread extends Thread {
       private Button button1;
       public TextThread(Button button1) {
               this.button1 = button1;
       }
       public void run() {
               String [] text = {"클릭", "누르기", "이동", "확인", "Apply"};
               
               int idx1 = 0;
               while(true) {
                      idx1 = idx1+1;
                      try {
                              Thread.sleep(1000);
                              button1.setLabel(text[idx1 % text.length]);
                              
                      } catch (InterruptedException e) {
                              e.printStackTrace();
                      }
               }
       }
}

package guiEx1;
public class GuiEx1Main {
       public static void main(String[] args) {
               new GuiEx1();
       }
}

메인에서는 생성자만 부르면 됩니다.



package guiEx2;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;

public class GuiEx2 extends Frame {

    public GuiEx2() {

        setTitle("GUI 두번째 프로그램");
        setLocation(100, 100);
        setSize(500, 500);

        Panel p = new Panel();

        Checkbox cb1 = new Checkbox("독서");
        Checkbox cb2 = new Checkbox("프랑스 자수");
        Checkbox cb3 = new Checkbox("음악 감상");
        Checkbox cb4 = new Checkbox("게임");
        Checkbox cb5 = new Checkbox("컬러링북");
        Checkbox cb6 = new Checkbox("그림그리기");
        p.add(cb1);
        p.add(cb2);
        p.add(cb3);
        p.add(cb4);
        p.add(cb5);
        p.add(cb6);

        // 라디오 버튼 만들기
        CheckboxGroup group = new CheckboxGroup();
        Checkbox man = new Checkbox("남자", group, true);
        Checkbox woman = new Checkbox("여자", group, true);

        Choice ch = new Choice();
        ch.add("맥북 프로");
        ch.add("아이패드 프로");
        ch.add("아이폰 x");
        ch.add("선풍기");

        p.add(ch);

        p.add(man);
        p.add(woman);

        // 5개를 보여주고 여러 개를 선택할 수 있도록 해주는 리스트
        List list = new List(5, true);
        list.add("박보검"); // 0
        list.add("박서준"); // 1
        list.add("서강준"); // 2
        list.add("강동원"); // 3
        list.add("조진웅"); // 4
        list.add("유해진"); // 5
        list.add("용준형"); // 6
        list.add("양요섭"); // 7
        list.add("강다니엘"); // 8
        list.add("시우민"); // 9

        // list의 remove(int idx)를 이용하면 idx번재를 지울 수 있습니다.
        // list.remove(0);
        // 첫번째에 있는 c&c++과 5번째에 있는 objective-c를 제거 -> 0번과 4번을 제거
        // 여러개를 지울 때는 항상 뒤에서부터 삭제해야 합니다.
        // bcz.앞에서 지우면 뒤의 인덱스에 영향을 주기 때문입니다.
        // 0을 지우면 원래 4번은 3번이 됩니다.
        list.remove(4);
        list.remove(0);

        p.add(list);

        add(p);
        setVisible(true);

    }

}


package guiEx2;
public class Main {
       public static void main(String[] args) {
               new GuiEx2();
       }
}






















'JAVA 공책 > 수업 메모' 카테고리의 다른 글

Java, swing, Android의 view의 이벤트 처리형식  (0) 2018.07.18
GUI - Java.awt 패키지의 component & 이벤트 처리  (0) 2018.07.18
Scanner  (0) 2018.07.12
날짜&시간  (0) 2018.07.12
자료구조  (0) 2018.07.11