자바의 JTable과 Oracle 데이터베이스의 EMP 테이블을 연동하는 예
EmpJTableFrame.java
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class EmpJTableFrame extends javax.swing.JFrame
{
private JTable table;
private EmpTableModel model;
public EmpJTableFrame()
{
initComponents();
model = new EmpTableModel();
table = new JTable(model);
table.setFillsViewportHeight(true);
EmpTableModelHandler modelHandler = new EmpTableModelHandler();
table.getModel().addTableModelListener(modelHandler);
// 테이블 셀을 클릭하면 호출되는 이벤트 핸들러
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int column = table.getSelectedColumn();
int row = table.getSelectedRow();
String cellData = table.getModel().getValueAt(row, column).toString();
System.out.printf("%d, %d, %s\n", row, column, cellData);
}
});
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(50, 50, 400, 400);
this.getContentPane().add(scrollPane);
}
// 버튼을 누르면 호출되는 핸들러 메소드, 모델객체를 새로 생성하여 table.setModel( model )을 이용하면 스크롤바가 작동함
private void actionPerformed( ActionEvent evt ) {
model = new MyTableModel();
EmpDAO dao = new EmpDAO();
List<EmpVO> list = dao.getEmpList();
model.setEmpList(list);
table.setModel(model);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new EmpJTableFrame().setVisible(true);
}
});
}
}
EmpTableModel.java
import java.util.List;
import javax.swing.table.AbstractTableModel;
class EmpTableModel extends AbstractTableModel
{
private boolean DEBUG = true;
private String[] columnNames;
private Object[][] data;
EmpTableModel()
{
columnNames = new String[]{"EMPNO", "ENAME", "HIREDATE", "DEPTNO", "SAL"};
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
// 한개의 셀을 그릴 때마다 호출됨
public Object getValueAt(int row, int col) {
//System.out.print("getValueAt("+row+","+col+")");
return data[row][col];
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) { // 이 메소드가 true 를 리턴한 경우에는 해당 셀을 편집가능하게 설정함
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
// JTable의 셀을 편집하고 엔터를 치면 호출되는 메소드
public void setValueAt(Object value, int row, int col) { // TableModelListener.tableChanged()보다 먼저 호출됨
System.out.println("setValueAt("+value+","+row+", "+col+")");
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
data[row][col] = value;
fireTableCellUpdated(row, col); // 모든 리스너에게 셀 데이터 변경 통보
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}
// 한 사원정보를 JTable 에 출력하려면 이 메소드를 호출하고 table.repaint()를 호출하면 됨
public void setEmp(EmpVO emp)
{
data = new Object[1][];
data[0] = new Object[5];
data[0][0] = emp.getEmpno();
data[0][1] = emp.getEname();
data[0][2] = emp.getHiredate();
data[0][3] = emp.getDeptno();
data[0][4] = emp.getSal();
}
// 사원정보 리스트를 JTable 에 출력하려면 이 메소드를 호출하고 table.repaint()를 호출하면 됨
public void setEmpList(List<EmpVO> list)
{
data = new Object[list.size()][];
for(int i=0;i<data.length;i++) {
data[i] = new Object[5];
data[i][0] = list.get(i).getEmpno();
data[i][1] = list.get(i).getEname();
data[i][2] = list.get(i).getHiredate();
data[i][3] = list.get(i).getDeptno();
data[i][4] = list.get(i).getSal();
}
}
private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
} // End of MyTableModel class