JTable의 셀에 JCheckBox나 JButton같은 컴포넌트를 추가하고 싶은 경우도 있을 것입니다.

JTable내부에 출력될 데이터를 TableModel에 셋팅한 후 실제 데이터를 셀로 찍어내는 일을 담당하는 것이 TableCellRenderer클래스라고 앞 강좌에서 말씀드렸습니다.

 

사용자가 JTable의 모델에 데이터를 삽입하거나 , 삭제하거나 , 수정하거나 하면 내부적으로 이벤트가 발생되며 이 값들에 대한 객체가 TableCellRenderer에 전달될 것입니다. TableCellRenderer는 어떤 컴포넌트로 그려야 할지 반환하고 그 반환된 객체가 그대로 화면에 그려지는 식으로 내부처리가 진행된다고 생각하면 됩니다.

 

기본적인 TableCellRenderer는 그냥 문자열을 출력하는 일을 담당합니다. 우리가 아무것도 하지 않고 JTable을 추가하면 텍스트만 나오는 것을 아실것입니다.

만약 JCheckBox나 JButton같은 컴포넌트가 그려지도록 처리하고 싶다면 기본적인 일을 하는 TableCellRenderer가 JCheckBox나 JButton을 그리도록 개발자가 직접 코딩하여 설정해야 합니다. 즉, 내가 원하는 작업을 수행하는 TableCellRenderer가 필요하다는 것입니다.

 

이러한 작업을 하기에 가장 적합한 일은 무엇일까요? 자바에서는 기존것을 모두 갖고 있는 상태에서 일부의 내용을 바꿀 수 있는 아주 쉬운 방법을 제공합니다. 바로 상속이죠~~~~

 

기존에 Java API에서 지원하는 TableCellRenderer를 상속받아 새로운 나만의 TableCellRenderer를 작성하면 됩니다.

그리고 JTable의 각 컬럼에 작성한 TableCellRenderer를 셋팅해주면 끝입니다.

 

<<작성방법>>

1. TableCellRenderer를 상속하여 TableCellRenderer클래스 작성하기

먼저 나만의 TableCellRenderer를 만들어 보도록 하겠습니다. 보통은 TableCellRenderer를 직접적으로 상속받아 처리하지 않고 하위인 DefaultTableCellRenderer을 상속받아 처리합니다. 상속받은 후

이클립스의 자동완성 기능을 이용하여 getTableCellRendererComponent(...)메소드를 오버라
이딩합니다. 자동완성 기능을 이용하여 오버라이딩하면 부모의

getTableCellRendererComponent메소드를 호출한 결과를 리턴하는 코드가 삽입될 것입니다.

 

[getTableCellRendererComponent메소드의 매개변수]

JTable table : 현재 작업 중인 JTable

Object value : 현재 작업 중인 JTable의 셀객체

int row : 현재 작업 중인 row번호

int column : 현재 작업 중인 column번호

우리는 JCheckBox를 삽입할 것이므로 column번호가 6인 경우에 JCheckBox를 생성해서 버튼에 현재 JCheckBox를 생성해서 리턴하도록 설정하였습니다.

 

public class MyDefaultTableCellRenderer extends DefaultTableCellRenderer{

@Override
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
  	Component comp = null;
  	if(column==6){
 	 	comp = new JCheckBox();

	}
	return comp;
}
​

 

2. JTable에 사용자정의로 작성된 TableCellRenderer연결하기

TableCellRenderer작성 작업이 완료되면 JTable이 인식하는 기본 TableCellRenderer대신에 우리가 작성한 TableCellRenderer를 셋팅해주면 됩니다.

여러가지 방법이 있지만 JTable의 getColumn()메소드를 TableColumn객체를 얻어내고 TableColumn객체의 setCellRenderer메소드를 이용하여 TableCellRenderer를 셋팅합니다.

우리가 작성한 MyDefaultTableCellRenderer객체를 생성한 후 "경력여부"라는 컬럼에 셋팅하는 코드 입니다.

DefaultTableCellRenderer renderer = new MyDefaultTableCellRenderer();
table.getColumn("경력여부").setCellRenderer(renderer);​

 

3. 전체 소스

package gui.advanced;

import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyDefaultTableCellRenderer 
extends DefaultTableCellRenderer{

@Override
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
  Component comp = null;
  if(column==6){
  comp = new JCheckBox();

  }
  return comp;
  }
}
​
package gui.advanced;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import jdbc.MemberDAO;
import jdbc.MemberDTO;

public class JTableInsertComponent extends JFrame{
 DefaultTableModel model;
 JTable table; 
 Vector data = new Vector();
 Vector<String> colName = new Vector<String>();
 public JTableInsertComponent(String title){
  super(title);
  display();
  startEvent();
  setSize(400,150);
  setVisible(true);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  
 }
 public void dataSetting(){
  colName.add("아이디");
  colName.add("패스워드");
  colName.add("성명");
  colName.add("주소");
  colName.add("메모");
  colName.add("등록일");
  colName.add("경력여부");
  colName.add("예약하기");
 }
 public void showAllData(){
  MemberDAO dao = new MemberDAO();
  data = dao.selectTable();
  model.setDataVector(data, colName);
 }
 public void display(){
  Container c = getContentPane();
  
  dataSetting();
  
  model = new DefaultTableModel(data, colName);
  showAllData();
  table = new JTable(model);
  table.getColumnModel().getColumn(7).setPreferredWidth(150);
  table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  
  JScrollPane scroll = new JScrollPane(table);
  DefaultTableCellRenderer renderer = 
    new MyDefaultTableCellRenderer();
  table.getColumn("경력여부").setCellRenderer(renderer);
  c.add(scroll,BorderLayout.CENTER);
 }

 public void startEvent(){
  //table.addMouseListener(this);
 }
 public static void main(String[] args){
  JTableInsertComponent obj = new JTableInsertComponent("테이블연습");
 }
}

 

 

4. 실행

실행하면 다음과 같이 JTable에 JCheckBox가 삽입된 것을 확인할 수 있습니다.

JTableInsertComponent.java
0.00MB
MyDefaultTableCellRenderer.java
0.00MB

 

+ Recent posts