본문 바로가기

카테고리 없음

7. 자바 GUI & 프로젝트

중간고사가 끝나고 자바 프로젝트가 시작되었다. 자유로운 주제로 GUI를 구현하는 것인데 그 과정을 기록하고자 한다.

 

  • 자바 GUI 특징

자바 GUI는 AWT 패키지와 Swing 패키지로 구현할 수 있다.

 

AWT는 처음 나왔을 때 함께 배포된 GUI 라이브러리이고,

Swing은 순수 자바 언어로 라이브러리를 제공한다.

 

출처: 명품 프로그래밍

보통 이렇게 프레임을 구현한다.

 

버튼이나 input 필드가 있는 걸 보니 마치 프론트 개발과도 비슷해보인다.

 

AWT와 Swing도 object를 상속 받는 구조를 가지고 있다. 많은 종류가 있지만

Container를 기본적으로 사용한다. Swing에는 앞에 J가 붙은 클래스 이름을 사용한다.

 

이제부터는 보통 JFrame을 사용할 예정이다.

 

  • component

컨테이너에 포함되어야 화면에 출력할 수 있는 순수 컴포넌트이다.

말 그대로 JFrame같은 최상위 레벨 컨테이너에 속해있어야 한다.

 

모든 컴포넌트는 AWT를 상속받고, 모든 스윙 컴포넌트는 swing을 상속받는다.

 

  • 스윙 프레임

JFrame을 상속 받아서 구현한다.

프레임과 메뉴바, content pane이라는 컴포넌트가 부착되는 공간을 포함한다.

 

이런 형식으로 이해하면 된다.

 

content pane에 컴포넌트를 추가하면 화면에서 볼 수 있다!

getContentPane을 사용하여 가져와서 그곳에 추가한다.

 

GUI프로그래밍을 할 때

main을 클래스 내의 멤버로 작성할 수 있다.

 

import javax.swing.*;
public class MyFrame extends JFrame {
  MyFrame() {
    setTitle("첫번째 프레임");
    setSize(300,300);
    setVisible(true);
  }
public static void main(String [] args) {
    MyFrame mf=new MyFrame();
  }
}

 

프레임을 종료시킬 때 x버튼을 누르면 프레임은 종료되지만, 응용 프로그램은 계속해서 작동한다.

따라서 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 라는 코드를 작성하여

버튼을 누름과 동시에 프로그램도 종료할 수 있게한다.

 

  • 배치 관리자 layout manager

AWT 패키지에 구현되어 있으며 종류는 4가지가 있다.

컨테이너마다 디폴트 배치관리자가 있다. 우리가 자주 사용할 스윙 컨테이너 JFrame은 BorderLayout 가진다.

FlowLayout: 왼쪽에서 오른쪽 순서로 배치하고, 프레임이 제한적이면 다시 위에서 아래로 순서대로 배치한다.

 

BorderLayout: 컨테이너 공간을 다섯 구역으로 분할하여 배치한다. add를 사용하여 add(컴포넌트, BorderLayout.WEST)

                          컴포넌트를 해당 공간에 배치한다.

 

GridLayout: 컨테이너 공간을 사각형 격자로 분할, 각 셀에 하나의 컴포넌트를 배치한다. 격자는 행수와 열수를 지정하고,

                     왼쪽에서 오른쪽 순서, 위에서 아래 순서로 배치한다.

 

CardLayout: 겹쳐지게끔 배치한다.

 

배치관리자가 없는 경우) 직접 절대 크기와 절대 위치를 결정해준다. 

             컴포넌트의 크기나 위치를 임의로 지정하거나 입력에 따라 위치가 수시로 변하는 경우, 겹쳐 출력하는 card레이아웃 같은

             경우들에 사용한다.

 

null로 지정하여 배치관리자를 삭제한다. container.setLayout(null);

 

 

  • 이벤트 기반 프로그래밍

프론트에서 개발할 때 마우스 입력, 키보드 입력에 따라 이벤트를 처리하는 로직이 많다.

이처럼 GUI에서도 이벤트를 처리해줄 수 있다.

 

이벤트 발생 - 이벤트 객체 생성 - 리스너 찾기 - 리스너 호출 - 리스너 실행

이런 순서로 처리한다.

 

이벤트 소스는 보통 우리가 생각하는 버튼과 같은 컴포넌트로 이해하면 된다.

getSource()를 통해 이벤트가 발생한 소스의 컴포넌트를 받을 수 있다.

 

--이벤트 리스너: 클래스로 작성하여 이벤트를 처리하는 코드를 작성한다.

  보통 JDK에서 제공하는 인터페이스를 구현하는 형식이다.

  독립, 내부, 익명 클래스 3가지로 작성할 수 있는데 지금 배우는 예제들은 익명 클래스로 구현하는 게 많다.

 

b.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
    ...
    }
});

바로 작성할 수 있다.

 

  • 어댑터 클래스

리스너 구현 대신 어댑터 클래스를 사용하는 편이 더 좋을 수 있다.

리스너의 모든 메소드가 단순 리턴하도록 구현해놓았다.

 

보통 key,mouse,focus어댑터 클래스를 많이 사용한다.

 

class MyMouseAdapter extends MouseAdapter{
  public void mousePressed(MouseEvent e){ //메소드를 골라서 구현할 수 있다.
    ...
  }
}

 

 

여기까지 간단한 이론을 알아보았다. GUI프로그래밍은 이론보다 다양한 예제를 만들어보면서 실습하는 것이 더 중요하다.

앞으로 있을 프로젝트도 구현하면서 또 기록해야겠다.


 

<GUI기반 응용프로그램 개발>

1. 프로젝트 자유 주제 선정

2. 요구사항 분석

3. 테스트 계획서

+ 예상 결과물 도안 필요

 

내가 하고 있는 것: 학교 댕기기, 카페 알바, OTT보기, 가끔 운동

필요로 하는 것: 공부 쉽게 하기, 시간 잘 쓰기, 포스 결제 잘하기..?

내가 좋아하는 것: 영화관 가서 혼자 영화보기, 과자 먹기...?

 

고민이 조금 더 필요할 거 같다.