티스토리 뷰

배운 것 기록/java

JTable

키죽 2022. 7. 28. 11:01

JTable


데이터를 테이블(표) 형식으로 표현하는 컴포넌트

- 행, 열 구조로 데이터가 구성되며 2차원 배열을 사용해 데이터를 추가하거나, Vector 객체를 사용하여 추가가 가능하다.

=> 직접 추가하는 것보단 Model 객체 (DefaultTableModel)를 사용하여 추가

- 기본적으로 스크롤 기능이 없으므로 데이터가 많아지면 관리가 어렵다.

=> JScrollPane 객체를 활용하여 스크롤 기능을 추가해서 사용 (JTable > JScrollPane > JFrame 순으로 부착)

 

1. JScrollPane 객체 생성 후 JFrame에 부착하고,

2. JTable 객체 생성 후 JScrollPane의 ViewportView 영역에 부착한다

JScrollPane scrollPane = new JScrollPane();
f.add(scrollPane, BorderLayout.CENTER);

JTable table = new JTable();
scrollPane.setViewportView(table);

 

이대로라면 아무것도 뜨지 않으니,

3. JTable에 데이터를 추가해본다!

 

1) DefaultTableModel 객체에 배열 형태로 데이터 추가

=> 1차원 배열을 생성해 열 제목을 저장하고(헤더에 해당) 2차원 배열을 생성해 데이터를 추가한다(DB에 해당)

String[] columnNames = {"번호", "이름", "아이디", "패스워드"}; 	// 제목(th)
String[][] data = {						// DB에서 가져온 데이터
        {"1", "홍길동", "hong", "hong123"},
        {"2", "우영우", "woo", "woo123"},
        {"3", "동그라미", "circle", "circle123"},
        {"4", "김희선", "hskim", "hskim123"},
        {"5", "소지섭", "sojs", "soj123"},
        {"6", "강감찬", "kang", "kang123"},
        {"7", "이순신", "lee", "lee123"},
};

// DefaultTableModel을 찾아본다
DefaultTableModel dtm = new DefaultTableModel(data, columnNames);

// 테이블 객체에 만들어진 걸 부착한다
table.setModel(dtm);

출력 시 이렇게 나온다~!
수정도 가능하고, 스크롤팬을 삽입했기 때문에 창을 줄이면 스크롤이 생긴다

 

이런 형식의 개발을 하게 될 거라니 유의해서 봐두자!

웹 개발 시 이걸 활용하여 입력, 수정 / + / - 버튼 등을 넣어서 동작하는 테이블을 만들 수 있다. 

 

하지만 이 방법을 쓰면 일반적인 배열은 크기가 불변이므로 데이터가 추가되는 경우엔 사용이 어렵다.

=> Vector를 사용하는 게 좋겠지?

 

 

2) DefaultTableModel 객체에 Vector 객체 형태로 데이터 추가

 

2-1. 제목과 데이터가 한꺼번에 추가되는 경우,

데이터가 미리 준비된 상태에서 Model 객체 생성과 테이블 추가 작업이 수행

// 제목
Vector<String> columnNames = 
        new Vector<String>(Arrays.asList("번호", "이름", "아이디", "패스워드"));
// 데이터
Vector data = new Vector();

 

2차원 배열로 만들어야하니 벡터 안의 벡터가 있는 구조로 벡터를 하나 더 만든다
한 건 한 건의 데이터

Vector rowData = new Vector();
rowData.add(1); rowData.add("홍길동"); rowData.add("hong"); rowData.add("hong123");
data.add(rowData);

rowData = new Vector();
rowData.add(2); rowData.add("우영우"); rowData.add("woo"); rowData.add("woo123");
data.add(rowData);

rowData = new Vector();
rowData.add(3); rowData.add("동그라미"); rowData.add("circle"); rowData.add("circle123");
data.add(rowData);

// 추가
DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
table.setModel(dtm);

 

 

2-2 제목만 추가 후 1개 레코드씩 데이터 Vector 객체를 별도로 추가하는 경우

=> 데이터가 미리 만들어져 있지 않은 상태에서 열 제목 먼저 추가하고 데이터는 차후에 추가하는 방법

Vector<String> columnNames = 
        new Vector<String>(Arrays.asList("번호", "이름", "아이디", "패스워드"));

// DefaultTableModel 객체를 생성해 제목열Vector 객체를 먼저 추가
DefaultTableModel dtm = new DefaultTableModel(columnNames, 0);
table.setModel(dtm);

이런 식으로 헤더를 조정하는 것도 가능하다(설정도 가능), 오른쪽은 new DefaultTableModel(columnNames, 10)을 주었다.

 

별도로 데이터를 추가하기 위해 Vector 객체를 생성하여

1개 레코드를 저장 후, DefaultTableModel 객체의 addRow() 메서드로 추가

 

=> 별도의 메서드에서 데이터 추가 작업이 이루어져야 할 경우,

DefaultTableModel 객체를 JTable 객체에서 가져와 작업을 수행한다.

=> getModel() 메서드로 Model 객체 형태로 리턴받아 추가작업 수행

DefaultTableModel myModel = (DefaultTableModel)table.getModel();
// 기존의 제목열 및 추가된 데이터가 있을 경우엔 그대로 유지가 될 거다

// 1차원 배열을 하나하나 추가
Vector rowData = new Vector();
rowData.add(1); rowData.add("홍길동"); rowData.add("hong"); rowData.add("hong123");
myModel.addRow(rowData);

rowData = new Vector();
rowData.add(2); rowData.add("우영우"); rowData.add("woo"); rowData.add("woo123");
myModel.addRow(rowData);

rowData = new Vector();
rowData.add(3); rowData.add("동그라미"); rowData.add("circle"); rowData.add("circle123");
myModel.addRow(rowData);

 

 

'배운 것 기록 > java' 카테고리의 다른 글

절대값 구하기 - 삼항연산자 / Math.abs()  (1) 2022.10.06
JCheckBox, JComboBox, JSpinner  (0) 2022.07.27
JOptionPane  (0) 2022.07.27
JTextField, JPanel  (0) 2022.07.27
레이아웃(layout)  (0) 2022.07.26
댓글
최근에 올라온 글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함