• 검색 결과가 없습니다.

① 테이블에 출력될 데이터를 2차원 배열에 저장한다

N/A
N/A
Protected

Academic year: 2022

Share "① 테이블에 출력될 데이터를 2차원 배열에 저장한다"

Copied!
6
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

JTable에서 사용하는 Model객체

● JTable

- JTable은 데이터베이스의 검색결과를 GUI에 보여주기 위해 사용되는 컴포넌트이다. 가로와 세로로 구성된 테이블을 을 사용해서 행과 열에 데이터를 위치시킨다.

- JTable을 사용하는 방법은 다음과 같다.

① 테이블에 출력될 데이터를 2차원 배열에 저장한다.

Object[][] records = { { ... }, { ... }, { ... } };

② 제목으로 사용할 문제열을 1차원 배열에 저장한다.

String[] titles = { “제목1”, “제목2”, ... , “제목n” };

③ 위의 ①과 ②를 사용해서 JTable을 생성한다.

JTable table = new JTable(records, titles);

④ 위의 ③에서 생성한 테이블을 스크롤이 있는 패널에 붙인다. 테이블에 출력되는 데이터의 갯수가 많으면 한 화면 을 넘기게되는데, 이런 경우에는 스크롤을 사용해서 다음 화면의 데이터를 볼 수 있도록 해야 한다. 그래서, 일반적으 로 테이블을 스크롤이 있는 패널(JScrollPane)에 붙인다.

JScrollPane scrollpanel = new JScrollPane();

⑤ 위의 ④에서 생성된 스크롤이 있는 패널을 윈도우 프레임에 붙인다.

add(scrollPanel);

- 테이블 사용 예제

public class TableExam extends JFrame { Object[][] data = {

{"홍길동", "[email protected]", "1221", 15}, {"박길동", "[email protected]", "1245", 30}, {"최길동", "[email protected]", "2332", 20}

};//테이블에 출력할 데이터

String[] columnName = {"이름", "이메일 주소", "암호", "나이"};//열의 제목으로 사용될 문자열 JTable table;

public TableExam() {

table = new JTable(data, columnName);

add(new JScrollPane(table));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(500, 200);

setVisible(true);

}

public static void main(String[] args) { new TableExam();

} }

(2)

● JTable과 MVC(Model-View-Controller) 구조

- 모델-뷰-컨트롤러 구조는 데이터의 저장과 접근에 대한 제공은 모델이 담당하고, 화면 표시는 뷰, 이벤트의 처리는 컨트롤러가 하도록 각 역할을 구분한 구조이다. 즉, 역할의 분담을 통하여 상호간의 영향을 최소화 하고 각 요소의 독립성을 보장하여 독자적인 역할에 충실할 수 있는 형태이다.

- 이 구조를 사용하면 한 개의 데이터 모델을 사용해서 다양한 형태의 뷰를 사용해서 보여줄 수 있다.

- JTable을 이용한 데이터 출력작업을 MVC 구조로 분리하면, JTable은 뷰 역할만을 수행하고 테이블에 출력되는 데이터는 모델 역할만 수행한다. 따라서, JTable은 데이터에 관여할 필요가 없어지고, 모델 역할을 하는 데이터도 JTable에 관여하지 않는다.

- JTable은 단지 데이터를 보여주는 역할을 한다.

- JTable은 내부적으로 DefaultTableModel 객체를 사용해서 테이블에 출력할 모델로 사용한다.

- 모델 객체를 사용해서 테이블을 작성하는 절차는 다음과 같다.

① 모델 클래스 설계

public class 클래스이름 extends AbstractTableModel { }

② 모델 객체 생성

클래스이름 model = new 클래스이름();

③ 모델을 사용해서 JTable 객체 생성

JTable table = new JTable(model);

④ 윈도우 프레임에 테이블을 붙인다.

add(new JScrollPane(table));

- JTable의 개념도(MVC)

- 테이블은 데이터의 행의 갯수와 열의 갯수, 열의 제목 등을 읽어서 데이터를 테이블에 출력한다.

- JTable이 기본적으로 가지고 있는 모델이 있는데, 이 모델은 TableModel 이다.

- 모델 객체는 테이블에서 사용할 수 있도록 “행의 갯수”, “열의 갯수”, “열의 제목” 등을 알려주는 메서드를 가지고 있다. 각각 getRowCount(), getColumnCount(), getColumnName(열의번호) 메서드이다.

(3)

- JTable의 기본으로 가지고 있는 TableModel을 사용한 예

class JTableTest1 {

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[] = { "이름", "나이", "성별" };

Object data[][] = { { "김철수", 24, '남' }, { "이순희", 21, '여' }, { "박지영", 26, '여' } };

JTable table = new JTable(data, colNames);

JScrollPane scrollPane = new JScrollPane(table);

contentPane.add(scrollPane, BorderLayout.CENTER);

JButton button = new JButton("출력");

button.addActionListener(new PrintActionListener(table));

contentPane.add(button, BorderLayout.SOUTH);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setVisible(true);

} }

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++) {

(4)

Object obj = model.getValueAt(row, col);

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

}

System.out.println();

}

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

} }

● 데이터베이스의 조회결과를 JTable에 출력

- 데이터베이스의 조회 결과를 JTable에 출력하기 위해서는 우선 Model에 조회결과 데이터를 저장해야 한다. 그런데, JTable이 기본적으로 가지고 있는 TableModel에는 데이터베이스의 조회결과를 저장하는 일을 하는 메서드가

존재하지 않는다.(다음 그림의 ? 부분)

- 따라서, 조회 결과를 모델에 저장하는 메서드가 있는 모델이 필요하다.

- TableModel에는 조회 결과를 저장하는 메서드가 존재하지 않으므로, 새로운 모델을 만든 후 데이터 베이스 조회결과를 모델에 저장하는 새로운 메서드를 정의해야 한다.

- 새로운 모델 객체를 만드는 방법은 다음과 같다.

AbstractTableModel 클래스를 상속해서 새로운 이름의 모델 클래스를 만든다.

class NewModel extends AbstractTableModel {

}

② 모델 객체가 기본적으로 가지고 있는 다음의 메서드들을 오버라이딩한다.(data는 데이터베이스 조회결과가 저장될 2차원 배열의 이름)

public int getColumnCount() {//출력할 데이터의 열의 갯수를 알려주는 메소드 return data[0].length;//4개 열로 구성되어 있으므로 4를 리턴한다.

}

public int getrowCount() {//출력할 데이터의 행의 갯수를 알려주는 메소드 return data.length;//3개의 행으로 구성되어 있으므로 3을 리턴한다.

}

(5)

메소드 이름 설 명

next() 현재 행에서 한 행 다음으로 이동

previous() 현재 행에서 한 행 앞으로 이동

first() 현재 행에서 첫번째 행의 위치로 이동

last() 현재 행에서 마지막 행의 위치로 이동

public int getrowCount() {//출력할 데이터의 행의 갯수를 알려주는 메소드 return data.length;//3개의 행으로 구성되어 있으므로 3을 리턴한다.

}

//테이블에서 해당 열,행을 선택했을 때 그곳에 저장된 데이터를 알려주는 메소드 public Object getValueAt(int rowIndex, int columnIndex) {

return data[rowIndex][columnIndex];//해당 위치의 데이터를 리턴한다.

}

public String getColumnName(int column) {//지정된 열(column)의 제목을 알려주는 메서드 return columnName[column];

}

③ 데이터베이스의 검색 결과의 건 수를 이용해서 모델에 저장될 데이터의 행의 수를 설정하는 메서드를 작성한다.

void 메서드이름(ResultSet resultSet) { try {

resultSet.last(); ← 검색된 결과의 맨 마지막 행으로 이동한다.

rows = resultSet.getRow(); ← 마지막 행의 번호를 읽어온다.

} catch(Exception e) { e.printStackTrace();

}

※ 위 ③의 메서드에서 ResultSet의 last() 메서드를 사용하기 위해서는 ResultSet이 다음과 같이 생성되어야 한다.

- 데이터베이스로 부터의 검색 결과는 ResultSet 객체에서 관리한다.

String str = "select * from employees";

ResultSet rs = stmt.executeQuery(str);

- ResultSet에서 다음과 같은 메소드를 사용해서 검색 결과를 처리한다.

검색 결과

ResultSet

rs.first() rs.next()

rs.previous()

rs.last()

(6)

- 하지만, rs에서 사용할 수 있는 메서드는 next() 메서드만 가능하다. 다른 세 개의 메서드를 모두 사용하기 위해서는 다음과 같이 ResultSet을 생성해야 한다.

PreparedStatement pstmtScroll =

con.prepareStatement(str, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet rsScroll = pstmtScroll.executeQuery(sql);

④ 데이터베이스의 검색 결과를 모델에 저장하는 메서드를 작성한다.

void 메서드이름(ResultSet resultSet) { ResultSetMetaData rsmd;

try {

rsmd = resultSet.getMetaData();//검색된 결과에서 메타데이터를 읽어온다.

cols = rsmd.getColumnCount();//메타데이터에서 검색된 데이터의 열의 갯수를 읽는다.

columnName = new String[cols];//열의 갯수만큼 열 제목을 저장할 문자열 배열 생성 for(int i = 0; i < cols; i++) {//열의 갯수만큼 열의 제목을 읽어서 배열에 저장

columnName[i] = rsmd.getColumnName(i+1);

}

data = new Object[rows][cols];

//검색된 데이터의 행과 열값을 이용해서 데이터를 저장할 2차원 배열을 생성한다.

int r = 0;//시작 행의 번호를 설정 while(resultSet.next()) {

for(int c = 0; c < cols; c++) {

data[r][c] = resultSet.getObject(c + 1);

}//검색된 한 행의 데이터를 읽어온 후 data배열에 저장한다.

r++;//행의 번호를 증가시킨다.

}

resultSet.close();

}catch(Exception e) {

e.printStackTrace();

} }

⑤ Swing의 GUI 화면에서 JTable 컴포넌트와 모델 객체를 생성하고, 데이터베이스의 검색결과를 가지고 있는 ResultSet 객체를 두 가지의 버전(next() 메서드만 사용할 수 있는 버전, next(), first(), last(), previous() 메서드를 사용할 수 있는 버전)으로 생성한다.

⑥ 위의 ⑤번 과정에서 생성한 두 개의 ResultSet 객체 중 next() 메서드만 사용할 수 있는 ResultSet 객체를 ③번 과정에서 작성한 메서드에 전달하고, next(), first(), last(), previous() 메서드를 사용할 수 있는 ResultSet 객체를

④번 과정에서 작성한 메서드에 전달한다.

참조

관련 문서

저자들이 초기에 이러한 방법을 사용하였을 때 여러 개의 실을 사용하기 때문에 봉합사가 혼동되는 경우가 발생하였 는데, 이는 색깔이 서로 다른

: 다른 단량체와 세 개의 공유결합을 형성해 삼차원 망상형 분자구조를 형성하는 단량체 (예: phenol-formaldehyde)..

xy−평면의 곡선 C는 아래 그림과 같이 인접한 두 점 사이 의 거리를 지름으로 하는 세 개의 반원으로 이루어져 있고, 방향은 그림과

우리 삶 을 담아내고 삶이 이루어지는 국토와 도시 또한 탄소중립을 위해서는 지금과는 다른 방식으로 존재해야 한다.. 개별 도시가 모두 완전한 탄소중립을 실현하기는 어려울 수 있지만, 그

효과적인 학습 환경은 형식적 학습, 활동 학습(action learning), 그리고 경험 학습과 같은 세 개의 서로 다른 학습 형태를 적절하게 혼합하여 균형을 맞추고 있다.따라서

연결하는 비용이 적게 들어가는 지점이 A 이므로 6 개의 사무실을 다음과 같이 연결하 면 전산망을 구축하는데 필요한 비용이 최소 가

Local density approximation(LDA)와 generalized gradient approximation (GGA) 의 두 가지 다른 exchange correlation functional을 이용하고, 또한 두 개의 층 사이에

ü법랑소주는 다른 법랑소주와 나란히 배열 ü종단면의 모양: 고기비늘 모양, 혹은 열쇠구멍 모양 ü한 개의 법랑소주 꼬리는 세 개의