GUI 프로그래밍


1. 윈도우의 구성요소

타이틀 바 title bar

컨텐트 팬 content pane

프레임 frame

라벨 Label


JFrame frame = new JFrame(); // 빈 윈도우

JFrame frame = new JFrame("Hello Java"); // 타이틀 적용


Container contentPane = frame.getContentPane(); // ContentPane을 리턴

contentPane.add(new JLabel("Hello, Java")); // 안(라벨)에 들어갈 내용

contentPane.add(new JLabel("Hello, Java", Swingcontants.CENTER)); // 안(라벨)에 들어갈 내용 중앙 정렬

frame.setLocation(500,400); // 프레임을 원하는 위치에 띄워줌

frame.setPreferredSize(new Dimension(300,200)); // 프레임의 너비와 높이 지정

frame.pack(); // 프레임을 적절한 크기로 조절

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // frame 종료



package GUI프로그래밍;

import java.awt.*;

import javax.swing.*;

public class GUI {

public static void main(String[] args) {

JFrame frame = new JFrame("Hello Java Program"); 

Container contentPane = frame.getContentPane(); // ContentPane을 리턴

contentPane.add(new JLabel("Hello, Java", SwingConstants.CENTER)); // 안(라벨)에 들어갈 내용

frame.setLocation(500,400); // 프레임을 원하는 위치에 띄워줌

frame.setPreferredSize(new Dimension(300,200)); // 프레임의 너비와 높이 지정

frame.pack();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // frame 종료

frame.setVisible(true);

}

}







2. 텍스트 상자와 버튼


JTextField text = new JTextField(); // 텍스트 상자

JButton button = new JButton("확인"); // 버튼


보더 레이아웃 border layout (p742 참조)

contentPane.add(text, BorderLayout.CENTER); // BorderLayout을 이용해서 원하는 위치에 자동배치


package GUI프로그래밍;

import java.awt.*;

import javax.swing.*;

public class GUI {

public static void main(String[] args) {

JFrame frame = new JFrame("Hello Java"); 

frame.setPreferredSize(new Dimension(300,200));

frame.setLocation(500,400);

Container contentPane = frame.getContentPane();

JTextField text = new JTextField(); 

JButton button = new JButton("확인");

JLabel label = new JLabel("Hello");

contentPane.add(text, BorderLayout.CENTER);

contentPane.add(button, BorderLayout.EAST);

contentPane.add(label, BorderLayout.SOUTH);

 

frame.pack();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

frame.setVisible(true);

}

}





3. 이벤트의 처리 방법

버튼을 눌렀을 때 해야 할 일을 처리


버튼을 눌렀을 때의 처리

actionListener : public void actionPerformed(ActionEvent e)를 구현



package GUI프로그래밍;

import java.awt.event.*;

import javax.swing.*;


public class Event01action implements ActionListener {

JTextField text;

JLabel label;


Event01action(JTextField text, JLabel label) {

this.text = text;

this.label = label;

}


public void actionPerformed(ActionEvent e) {

String name = text.getText();

label.setText("hello" + name);

}

}

---------------------------------------------------
package GUI프로그래밍;
import java.awt.*;
import javax.swing.*;
public class WindowExample2 {

public static void main(String[] args) {
JFrame frame = new JFrame("Hello Program");
frame.setPreferredSize(new Dimension(200, 120));
frame.setLocation(500,400);
Container contentPane = frame.getContentPane();
JTextField text = new JTextField();
JButton button = new JButton("확인");
JLabel label = new JLabel("Hello");
contentPane.add(text, BorderLayout.CENTER);
contentPane.add(button, BorderLayout.EAST);
contentPane.add(label, BorderLayout.SOUTH);
Event01action listener = new Event01action(text, label);
button.addActionListener(listener);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);

}

}









4. 레이아웃과 패널


border layout : south north east west center 영역별로 배치

grid layout : 영역을 행과 열로 나누고 배치

flow layout  : 좌에서 우로 배치하고 폭이 모자라면 줄을 바꿔서 배치

box layout : 가로 또는 세로 순서대로 배치


(p748 참조)


package GUI프로그래밍; // 그리드 레이아웃

import java.awt.*;        

import javax.swing.*;        

class WindowExample3 {

    public static void main(String[] args) {

         JFrame frame = new JFrame("Zoo Program");

         frame.setLocation(500, 400);

         Container contentPane = frame.getContentPane();

         GridLayout layout = new GridLayout(3, 2);

         contentPane.setLayout(layout);

         contentPane.add(new JButton("얼룩말"));

         contentPane.add(new JButton("사자"));

         contentPane.add(new JButton("코끼리"));

         contentPane.add(new JButton("코뿔소"));

         contentPane.add(new JButton("펭귄"));

         contentPane.add(new JButton("하이에나"));

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.pack();

         frame.setVisible(true);

    }

}




package GUI프로그래밍; // 플로우 레이아웃. 크기 변경하면 위치도 같이 변경됨

import java.awt.*;        

import javax.swing.*;        

class WindowExample4 {

    public static void main(String[] args) {

         JFrame frame = new JFrame("Fruit Basket Program");

         frame.setLocation(500, 400);

         Container contentPane = frame.getContentPane();

         FlowLayout layout = new FlowLayout();

         contentPane.setLayout(layout);

         contentPane.add(new JButton("사과"));

         contentPane.add(new JButton("파인애플"));

         contentPane.add(new JButton("오렌지"));

         contentPane.add(new JButton("포도"));

         contentPane.add(new JButton("레몬"));

         contentPane.add(new JButton("복숭아"));

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.pack();

         frame.setVisible(true);

    }

}


※ FlowLayout은 크기 변경시 위치도 함께 바뀜.





package GUI프로그래밍; // 박스 레이아웃. 크기 변경해도 위치는 변경 안됨

import java.awt.*;

import javax.swing.*;

class WindowExample5 {

    public static void main(String[] args) {

         JFrame frame = new JFrame("Cafe Program");

         frame.setLocation(500, 400);

         Container contentPane = frame.getContentPane();

         BoxLayout layout = new BoxLayout(contentPane,

                                          BoxLayout.X_AXIS);

         contentPane.setLayout(layout);

         contentPane.add(new JButton("자바"));

         contentPane.add(new JButton("에스프레소"));

         contentPane.add(new JButton("카푸치노"));

         contentPane.add(new JButton("블루마운틴"));

         contentPane.add(new JButton("콜럼비아"));

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.pack();

         frame.setVisible(true);

    }

}


※ BoxLayout은 크기 변경시 위치가 바뀌지 않음.






5. JPanel을 이용한 컴포넌트 배치


JPanel panel = new JPanel(); // 패널을 생성

contentPane.add(panel);  


패널도 컴포넌트이므로 add 메소드를 이용하여 올려놓을 수 있음. 

패널도 setLayout 메소드를 이용하여 패널 자체의 레이아웃 설정 가능.


(p752 참조)

package GUI프로그래밍;

import java.awt.*;

import javax.swing.*;

public class JPanel02 {

public static void main(String[] args) {

JFrame frame = new JFrame("Hello Java");

frame.setLocation(500,400);

Container contentPane = frame.getContentPane();

JPanel panel = new JPanel();

panel.setLayout(new GridLayout(3,2));

JTextField text1 = new JTextField();

JTextField text2 = new JTextField();

JTextField text3 = new JTextField();

panel.add(new JLabel("이름"));

panel.add(text1);

panel.add(new JLabel("주소"));

panel.add(text2);

panel.add(new JLabel("전화번호"));

panel.add(text3);

contentPane.add(panel,BorderLayout.CENTER);

contentPane.add(new JButton("입력"),BorderLayout.SOUTH);

 

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setVisible(true);

}

}







6. JTable


생성할 때 헤더(1차 배열), 데이터(2차 배열)


JTable에 데이터를 리턴 받으려면 TableModel을 사용한다.


JTable에 행 추가 삭제
addRow(); // 행 추가
removeRow(); // 행 삭제




예제1. 테이블에서 출력 버튼을 누르면 명령 프롬프트 창으로 출력


1) 실행 클래스 

package GUI프로그래밍;

import java.awt.*;        

import javax.swing.*;        

class WindowExample7 {

    public static void main(String[] args) {

        JFrame frame = new JFrame("참가자 명단 프로그램");

        frame.setPreferredSize(new Dimension(300, 150));

        frame.setLocation(500, 400);

        Container contentPane = frame.getContentPane();


        String colNames[] = { "이름", "나이", "성별" };  // Jtable 헤더는 1차원 배열

        Object data[][] = { { "김철수", 24, '남' }, { "이순희", 21, '여' }, { "박지영", 26, '여' } };// Jtable 데이터는 2차원 배열


        JTable table = new JTable(data, colNames);   // 테이블 생성      

        JScrollPane scrollPane = new JScrollPane(table);  // 스크롤 기능 별도로 넣어줘야만 작동함

        contentPane.add(scrollPane, BorderLayout.CENTER); // contentPane에 테이블 적용


        button.addActionListener(new PrintActionListener(table));  // 출력버튼을 처리하는 PrintActionListener 클래스 


        contentPane.add(button, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();

        frame.setVisible(true);

    }

}

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

2) 출력 버튼 리스너 클래스 

package GUI프로그래밍;

import java.awt.event.*;        

import javax.swing.*;        

import javax.swing.table.*;        

class PrintActionListener implements ActionListener {

    JTable table;

    PrintActionListener(JTable table) {

        this.table = table;

    }

    public void actionPerformed(ActionEvent e) {

        TableModel model = table.getModel(); // 테이블 모델을 가져옴

        int rowNum = model.getRowCount(); // 테이블 행을 가져옴

        int colNum = model.getColumnCount();  // 테이블 열을 가져옴


        for (int col = 0; col < colNum; col++) {  

        String colName = model.getColumnName(col);  // 컬럼 이름을 가져와서 출력

            System.out.print(colName + "\t");

        }

        System.out.println();


        for (int row = 0; row < rowNum; row++) {

            for (int col = 0; col < colNum; col++) {

                Object obj = model.getValueAt(row, col);  // 데이터를 가져와서 출력

                System.out.print(obj + "\t");

            }

            System.out.println();

        }

        System.out.println("-----------------------------");

    }

}

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

3) 결과




예제2. 테이블에 행을 추가하고 삭제


1) 실행 클래스 

package GUI프로그래밍;

import java.awt.*;

import javax.swing.*;

import javax.swing.table.*;

public class WindowExample8 {

public static void main(String[] args) {

JFrame frame = new JFrame("참가자 명단 프로그램");

frame.setPreferredSize(new Dimension(400,200));

frame.setLocation(500,  400);

Container contentPane = frame.getContentPane();

String colNames[] = { "이름", "나이", "성별" };  // 테이블을 생성해서 content pane에 추가

DefaultTableModel model = new DefaultTableModel (colNames, 0);

JTable table = new JTable(model);

contentPane.add(new JScrollPane(table), BorderLayout.CENTER);

JPanel panel = new JPanel(); // 라벨, 텍스트 상자, 버튼을 생성하여 테이블 아래쪽에 추가

JTextField text1 = new JTextField(6);

JTextField text2 = new JTextField(3);

JTextField text3 = new JTextField(2);

JButton button1 = new JButton("추가");

JButton button2 = new JButton("삭제");

panel.add(new JLabel("이름"));

panel.add(text1);

panel.add(new JLabel("나이"));

panel.add(text2);

panel.add(new JLabel("성별"));

panel.add(text3);

panel.add(button1);

panel.add(button2);

contentPane.add(panel, BorderLayout.SOUTH);

button1.addActionListener(new AddActionListener(table, text1, text2, text3)); // 추가 버튼에 대한 리스너

button2.addActionListener(new RemoveActionListener(table)); // 삭제 버튼에 대한 리스너

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setVisible(true);

}

}

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

2) 추가 버튼 리스너 클래스 

package GUI프로그래밍;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.table.*;

public class AddActionListener implements ActionListener {

JTable table;

JTextField text1, text2, text3;

AddActionListener(JTable table, JTextField text1,JTextField text2,JTextField text3){

this.table = table;

this.text1 = text1;

this.text2 = text2;

this.text3 = text3;

}

public void actionPerformed(ActionEvent e) {  // 텍스트 상자에 입력된 값으로 테이블 마지막 행을 추가

String arr[] = new String[3];

arr[0] = text1.getText();

arr[1] = text2.getText();

arr[2] = text3.getText();

DefaultTableModel model = (DefaultTableModel) table.getModel();

model.addRow(arr);

}

}

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

3) 삭제 버튼 리스너 클래스 

package GUI프로그래밍;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.table.*;

public class RemoveActionListener implements ActionListener  {

JTable table;

RemoveActionListener(JTable table) {

this.table = table;

}

public void actionPerformed(ActionEvent e){  // 선택된 행을 테이블로부터 삭제

int row = table.getSelectedRow();

if (row == -1) return;

DefaultTableModel model = (DefaultTableModel) table.getModel();

model.removeRow(row);

}

}

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

4) 결과

이름, 나이, 성별을 입력하고 추가 버튼을 누르면 테이블에 추가, 마우스로 행을 클릭하고 삭제 버튼을 누르면 해당 행 삭제.






Posted by netyhobby
,