SW

JAVA GUI 기초 다지기 본문

프로그래밍/JAVA

JAVA GUI 기초 다지기

LCD 2018. 10. 22. 19:02

JAVA Gui 기본 인터페이스 작성절차


애플리케이션의 GUI를 작성하기에 앞서 먼저 하나의 최상위 컨테이너를 생성해야만 한다.
스윙에서는 JFrame, JDialog, JApplet의 3가지 최상위 컨테이너가 있다.

JFrame : 윈도우와 메뉴를 가지는 일반적인 데스크탑 애플리케이션
JDialog : 메뉴가 없는 대화 상자 형식의 간단한 애플리케이션
JApplet : 애플릿을 작성하는데 사용

 - JFrame 클래스

최상위 클래스인 JFrame에 대해서 살짝 살펴보자.
위에서도 이야기 하였듯이 스윙에는 3가지의 최상위 컨테이너가 존재한다. 이들 클래스를 사용할 때 알아야 할 점을 짚어보자.

- 컨테이너는 컴포넌트들을 트리 형태로 저장한다. 최상위 컨테이너는 이 트리의 루트 노드가 된다.

- 각 컴포넌트들은 딱 한번만 컨테이너에 포함될 수 있다. 이미 다른 컨테이너에 들어 있는 컴포넌트를 또 다른 컨테이너에 넣으면  안 된다.
 
- 최상위 컨테이너는 내부에 콘텐트 페인(Content Pane)을 갖고 있다. 

- 최상위 컨테이너에는 메뉴바를 추가할 수 있다.

이제는 JFrame 객체의 속성을 변경시키는 방법을 알아보자

객체의 속성을 변경하기 위해서는 set으로 시작되는 설정자 메소드를 사용해야 한다. 이러한 설정자 메소드는 모드 JFrame 클래스에 정의되어 있지 않다.
JFrame 클래스는 많은 조상 클래스들을 가지고 있다. 구체적으로 알아 보자.


[공부하려고 손으로 쓴거니.. 퀄리티는 신경쓰지말자...]


우리가 상속에서 살펴보았듯이 조상 클래스가 제공하는 메소드들은 자식 클래스가 사용할 수 있다.

JFrame 클래스의 조상 클래스가 가지고 있는 메소드 중에서 많이 사용되는 메소드를을 살짝 살펴보자.

- add(Component)  : 프레임에 컴포넌트를 추가한다.
- setLocation(x, y), setSize(width, height) : 프레임의 위치와 크기를 설정한다.
- setIconImage(IconImage) : 윈도우 시스템에 표시할 아이콘을 알려준다.
- setTitle() : 타이틀 바의 제목을 변경한다.
- setResizable(boolean) : 사용자가 크기를 조절할 수 있는지를 설정한다.




- 기초 컴포넌트들


● 패널(JPanel) : 컨테이너의 일종
● 레이블(JLabel) : 텍스트를 표시할 수 있는 공간
● 텍스트필드(JTextField) : 사용자가 한 줄의 텍스트를 입력할 수 있는 공간
▶JTextField : 기본적인 텍스트 필드
▶JFormattedTextField : 사용자가 입력할 수 있는 문자를 제한한다.
▶JPasswordField : 사용자가 입력하는 내용이 보이지 않는다.
▶JComboBox : 사용자가 직접 입력할 수도 있지만 항목 중에서 선택할 수 있다.
▶JSpinner : 텍스트 필드와 버튼이 조합된 것으로 사용자는 이전 버튼과 다음 버튼을 이용하여 선택할 수 있다.
● 버튼(JButton) : 클릭되면 어떤 동작을 실행할 수 있는 버튼
▶JButton : 일반적인 버튼이다.
▶JCheckBox : 체크 박스 버튼
▶JRadioButton : 라디오 버튼으로 그룹 중의 하나의 버튼만 체크할 수 있다.
▶JMenuItem : 메뉴이다.
▶JCheckBoxMenuItem : 체크박스를 가지고 있는 메뉴항목이다.
▶JRadioButtonMenuItem : 라디오 버튼을 가지고 있는 메뉴 항목이다.
▶JToggleButton : 2가지 상태를 가지고 토글이 가능한 버튼이다.

텍스트 필드에서 텍스트를 가져오는 경우 getText() , 입력하는 경우 setText()이다.



최상위 컨테이너가 생성되었다면 다음 단계는 애플리케이션에 필요한 컴포넌트를 생성하여 컨테이너 안에 추가하는 것이다.

1. 컨테이너를 생성한다.

2. 컴포넌트를 추가한다.


본 글쓴이는 컨테이너를 만들면 안에 패널을 넣어 정리를 한 이후 패널 안에 컴포넌트를 추가한다.

import javax.swing.JFrame;


public class test {


public static void main(String[] args) {

JFrame f = new JFrame();        JFrame을 생성한다.

f.setTitle("JFrame Test");        윈도우창의 이름을 넣어준다.

f.setSize(400,400);                윈도우 창의 크기를 정한다.

f.setDefaultCloseOperation(3);     창을 닫기 클릭시 프로그램 종료

f.setVisible(true);                창을 보이려면 true 숨기려면 false

}

}


또는

import javax.swing.JFrame;


public class test extends JFrame{

test(){

setTitle("JFrame Test");

setSize(400,400);

setDefaultCloseOperation(3);

setVisible(true);

}

public static void main(String[] args) {

test ts = new test();

}

}



JFrame의 기본적인 절차이다.



이제 버튼을 생성 할 것인데 우선 패널을 넣어주고, 그 이후 패널의 레이아웃을 정해줘야 한다.

예를 들어 9개의 버튼을 만들고 레이아웃을 정해서 어떤 식으로 보여줄 지 정할 것이다.


본 글쓴이는 9개의 버튼을 FlowLayout 과 GridLayout으로 표현 할 것이다.




- FlowLayout 

우선 JPanel 과 JButton을 필요한 만큼 생성해준다.


그 이후 패널을 JFrame 안에 넣어준 이후 JButton을 JPanel 안에 추가해준다.



import java.awt.FlowLayout;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;


public class test extends JFrame{

JPanel p = new JPanel();

JButton button = new JButton("버튼");

JButton button1 = new JButton("버튼1");

JButton button2 = new JButton("버튼2");

JButton button3 = new JButton("버튼3");

JButton button4 = new JButton("버튼4");

JButton button5 = new JButton("버튼5");

JButton button6 = new JButton("버튼6");

JButton button7 = new JButton("버튼7");

JButton button8 = new JButton("버튼8");

test(){

setTitle("JFrame Test");

setSize(400,400);

setDefaultCloseOperation(3);

p.add(button);                JPanel 안에 JButton을 추가한다.

p.add(button1);

p.add(button2);

p.add(button3);

p.add(button4);

p.add(button5);

p.add(button6);

p.add(button7);

p.add(button8);

p.setLayout(new FlowLayout());

add(p);                        JPanel을 JFrame안에 추가한다.

setVisible(true);

}

public static void main(String[] args) {

test ts = new test();

}

}







- GridLayout

FlowLayout 했던것과 같다 하지만 조금씩 수정을 하였다.



import java.awt.GridLayout;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;


public class test extends JFrame{

JPanel panel;                

JButton[] button;

test(){

setTitle("GridLayout");

setSize(400,400);

setDefaultCloseOperation(3);

JButton[] button = new JButton[9];             JButton을 Array타입으로 9개 생성

panel = new JPanel();

panel.setLayout(new GridLayout(3,3));            패널을 GridLayout형태로 3x3 으로 만든다.

for(int i = 0; i < button.length; i++) {      반복문을 이용하여 버튼 배열의 길이만큼 버튼을 패널안에 추가 해준다.

button[i] = new JButton();

panel.add(button[i]);

}

add(panel);

setVisible(true);

}

public static void main(String[] args) {

test ts = new test();

}

}



- BorderLayout

BorderLayout은 North, West, East, Center, South 로 나뉜다. 각각 버튼을 위치 시켜주면 된다.
소스 코드를 확인해보자.

import java.awt.BorderLayout;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;


public class test extends JFrame{

JPanel p = new JPanel();

JButton button = new JButton("버튼");

JButton button1 = new JButton("버튼1");

JButton button2 = new JButton("버튼2");

JButton button3 = new JButton("버튼3");

JButton button4 = new JButton("버튼4");

test(){

setTitle("JFrame Test");

setSize(400,400);

setDefaultCloseOperation(3);


p.setLayout(new BorderLayout());

p.add(button, "North");                

p.add(button1, "West");

p.add(button2, "Center");

p.add(button3, "East");

p.add(button4, "South");

add(p);                    

setVisible(true);

}

public static void main(String[] args) {

test ts = new test();

}

}



이런식으로 나눌 수 있다.






---------------------------------------------------------------------





오늘 했던 내용을 종합해서 예제를 만들어보자. 예제는 어서와 Java는 처음이지? 에서 가져왔다.



온도 변환기를 작성해보자 섭씨에서 화씨로 바꿀 수 있는 녀석을 그래픽만 구현화를 해보자





import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;


public class test {


public static void main(String[] args) {

JFrame f = new JFrame();

JPanel panel = new JPanel();

f.setTitle("온도 변환");        

f.setSize(300,150);                

f.setDefaultCloseOperation(3);     

JLabel label = new JLabel("화씨 온도");

JLabel label1 = new JLabel("섭씨 온도");

JTextField field = new JTextField(15);

JTextField field1 = new JTextField(15);

JButton button = new JButton("Change");

panel.add(label);

panel.add(field);

panel.add(label1);

panel.add(field1);

panel.add(button);

f.add(panel);

f.setVisible(true);                

}


}



책에 있는 예제를 그대로 사용했고 소스코드도 동일하다.

항상 하듯 extends 로 JFrame 을 상속받아 별도 클래스를 작성하여 각종 초기화 문장들의 위치를 조정하여 해결해 보자.


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;


public class test extends JFrame {


JPanel panel = new JPanel();

JButton button = new JButton("변환");

JLabel label = new JLabel("화씨 온도");

JLabel label1 = new JLabel("섭씨 온도");

JTextField field = new JTextField(15);

JTextField field1 = new JTextField(15);

public test(){

setTitle("온도 변환");        

setSize(300,150);                

setDefaultCloseOperation(3);     

panel.add(label);

panel.add(field);

panel.add(label1);

panel.add(field1);

panel.add(button);

add(panel);

setVisible(true);                

}


public static void main(String[] args) {

test ts = new test();

}

}


이런식으로 초기화를 해준 후에 사용하면 동일한 결과 값이 나온다.








두 번째 예제는 피자 주문 화면 작성하기이다. 본 예제 또한 어서와 JAVA는 처음이지? 책을 인용했다.


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;


public class test extends JFrame {


JPanel panel = new JPanel();

JPanel panel1 = new JPanel();

JPanel panel2 = new JPanel();

JButton button = new JButton("콤보피자");

JButton button1 = new JButton("포테이토피자");

JButton button2 = new JButton("불고기피자");

JLabel label = new JLabel("피자나라에 오신걸 환영합니다.");

JLabel label1 = new JLabel("개수");

JTextField field = new JTextField(10);

JTextField field1 = new JTextField(10);

public test(){

setTitle("온도 변환");        

setSize(600,150);                

setDefaultCloseOperation(3);     

panel1.add(label);

panel2.add(button);

panel2.add(button1);

panel2.add(button2);

panel2.add(label1);

panel2.add(field);

panel.add(panel1);

panel.add(panel2);

add(panel);

setVisible(true);                

}


public static void main(String[] args) {

test ts = new test();

}

}



소스코드는 이러하다. 


이런 식의 결과 값이 나온다.


본 교과에서는 패널의 배경색을 바꾸는 문제를 내준다.


한번 해보도록 하자. 패널의 배경색을 변경할 경우에 panel.setBackground(Color.BLUE); 이런식으로 색을 변경하면 된다.


본 글쓴이는 맥을 사용하고 있는데... 정말 배경색을 아무렇게나 바꾸면 극혐 할 정도로 못봐줄 색이 나온다... 주의하자..


.





'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] String Lib  (0) 2019.06.07
JAVA GUI 기초 다지기 2  (2) 2018.10.23