안드로이드(코틀린)에 들어가면
이젠 GUI를 사용하게 된다.
그래서 코틀린으로 가기전에
맛보기로 GUI를 한번 체험해보자.
자바에서 GUI프로그래밍을 하기 위해선
GUI 프로그램이 필요한데
자바에선 크게 3가지 종류가 있다.
위의 있는 AWT와 Swing
그리고 요즘 많이 사용하는 JavaFX가 있다.
이번 시간에는
Swing을 이용해서
컴포넌트를 사용해볼 것이다.
(JavaFX는 따로 설치가 필요해서....)
스윙의 클래스 구조는 위의 사진과 같이 구성되어 있다.
그럼
실습해보자.
언제나 그랬듯 메인함수를 만들어주자.
GUI 환경에선
Frame을 먼저 만들어줘야한다.
(GUI에선 화면을 먼저 만들고 채우는 것이 국룰이라고 함)
JFrame은 Swing의 API 중 하나로
우리가 화면에 띄울 창을 만드는 것이다.
그리고 JFrame의 메소드인
setVisible을 true 값으로 설정해야지만
아래의 화면처럼 창이 뜨게 된다.
그럼 컨트롤 +F11을 눌러서 실행해보자.
그럼 이렇게 창(Frame)이 뜬다.
그러나 이 창을 꺼도 오른쪽 하단 콘솔창에
빨간색 버튼이 그대로 남아있다.
즉, 아직 실행이 되고 있는 상황이다.
이런 상황을 해결하기 위해
setDefaultCloseOperation 기능을 입력해줘야 한다.
그러나 매개변수 안에 0,1,2 등 설정된 값이 들어가야하는데
우리는 이런 것을 하나하나 알 수 없다.
이럴 때 원래 이 객체의 클래스명을 입력하고
.(점)을 입력해서 우리가 원하는 기능과 관련된
명칭(여기선 Close)를 입력하면 위의 사진처럼
close와 관련된 것이 나오며 설명 역시 나온다.
창을 닫으면 종료되길 원하니
EXIT_ON_CLOSE를 선택해준다.
(그러면 실행 창을 끄면 콘솔도 종료)
그리고 꼭 안해도 되지만
컴퓨터에서 출력할 때
창이 뜨는 위치를 정할 수 있다.
setLocation으로 정한다.
우선 Frame에서 레이아웃 형태는 크게 3가지가 있다.
기본적으로 적용된 BorderLayout (위,가운데,왼,오,아래 로 레이아웃이 나눠진 형태)이 있고
borderLayout과 많이 사용하는
FlowLayout(한줄로 배치)이 있다.
여기선 쉽게 다룰 수 있는 Flowlayout을 이용했다.
그리고 JButton 객체를 만들고 (생성자를 이용해 바로 글씨 넣기)
add 기능을 사용해 화면에 추가하였다.
그 결과 위의 사진처럼
버튼이 한줄로 배치되어 나오게 된다.
이번엔 글씨를 써서
결과창에 넣어보겠다.
글씨는 Label로 보통 쓰며
JLabel 객체를 만들어주고
add를 해야한다.
JTextField는 사용자가 글씨를 입력할 수 있게 해주는
컴포넌트로
입력창이라고 생각하면 된다.
마찬가지로,
JTextField 객체를 만들고
(매개변수엔 최소 몇 글자 사이즈인지 입력)
add해주면 끝.
그럼 이미지도 한번 넣어보자
이미지만 따로 관리하기 위해서
이미지 폴더를 만들고 난후
내가 사용할 이미지를 끌고와 이미지 폴더에 넣어준다.
이때 링크만 넣을 것이냐, 카피를 할 것이냐 묻는데
카피를 하게 해주자.
이미지는 따로 이미지용 컴포넌트가 없기때문에
JLabel에 이미지를 보여주는 기능을 활용해야한다.
(안드로이드에 가면 이미지 기능이 따로 있음)
우선 ImageIcon이라는 객체를 만들고
매개변수에 폴더명/파일명 을 입력해주자.
그리고 JLabel을 만들고
setIcon이라는 기능을 써주자.
그런데 위의 방식을 사용하면 사진이 원본 그대로 나와서
어쩔땐 너무 커서 짤리는 경우가 발생한다.
이럴 때 리사이징을 해줘야한다.
방법은 위의 방식에서 하나의 이미지 객체를 더 생성하고
이를 JLabel에 넣어줘야 한다.
위의 사진을 보면 중간에
Image im2를 만들고 거기다가 기존 이미지 파일을
getScaledInstance 기능을 한 것을 넣어주면 된다.
(매개변수는 사이즈와 이미지의 품질을 떨어트리지 않는 명령을 넣은 것이다.)
그리고 이제 위 작업을 한 im2를 Imageicon에 넣고
Jlabel을 이용해 add를 해준다.
그럼 위의 사진과 같이 내가 설정한
사이즈의 사진이 추가되며 사진의 품질 역시 떨어지지 않는다.
그런데 우리가 사용하는 컴퓨터언어는 Java이다.
즉 완전 객체지향을 꿈꾸는 언어이다.
따라서 메인 함수에 저런 것을 하나하나 다
적는 것은 객체 지향과는 거리가 좀 멀다.
그래서 JFrame을 상속한 나만의 Frame을 만들고
생성자 메소드를 사용해서
미리 저런 기본값이나 setting을 해놓아야 한다.
위의 다른 클래스를 이용해 Frame을 만들었기 때문에
메인 함수에는 Frame 객체만 생성하면
실행이 된다.
이외에도 Listener라는 개념 등이 있지만
우리는 안드로이드를 공부할 것이기에
나머지 부분들은 안드로이드에 맞게
내일부터 공부할 예정이다.
'# 개발 > Java' 카테고리의 다른 글
Java #13 - protocol, network (국비25일차) (0) | 2023.02.06 |
---|---|
Java #12 - Stream, 바이트스트림, 문자스트림 (국비24일차) (0) | 2023.02.03 |
Java #11 - Thread, runnable, 익명클래스, 동기화 (국비23일차) (0) | 2023.02.02 |
Java #10 -Generic, Collection API (국비22일차) (0) | 2023.02.01 |
Java #9 -오브젝트 클래스, 예외(Exception) (국비21일차) (0) | 2023.01.31 |