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);
}
}
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을 사용한다.
예제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) 결과
이름, 나이, 성별을 입력하고 추가 버튼을 누르면 테이블에 추가, 마우스로 행을 클릭하고 삭제 버튼을 누르면 해당 행 삭제.
'자바의 기초문법' 카테고리의 다른 글
자바 네트워크 통신 프로그래밍: ServerSocket, socket (0) | 2015.12.29 |
---|---|
GUI 윈도우로 작동하는 덧셈 프로그램 문제 (0) | 2015.12.29 |
멀티스레드 프로그래밍: Thread, Runnable (0) | 2015.12.28 |
객체의 직렬화와 역직렬화 (0) | 2015.12.28 |
네스티드 클래스: static nested class, inner calss (0) | 2015.12.28 |