티스토리 뷰
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);
별도로 데이터를 추가하기 위해 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 |