본문 바로가기

BackEnd/Java

[java]이것이 자바다 부록 Java UI 8 (Swing을 이용한 테이블 컴포넌트 1)

728x90
반응형

1. 테이블 컴포넌트

   ▷ 테이블 형식의 데이터를 표시하고 편집할 수 있는 컴포넌트, 다른 컴포넌트에 비해서 다소 복잡한 구조임


이름 컬럼의 데이터는 모두 텍스트, 나이 컬럼의 데이터는 모두 숫자로 구성

 

   ▷ 테이블은 컬럼과 행으로 구성, 컬럼과 행이 만나는 곳이 셀(실제 데이터가 표시되는 곳)

   ▷ 하나의 컬럼을 구성하는 셀들은 동일한 데이터 타입을 가져야 함

 

(1) 테이블 생성

   ▷ 간단한 JTable 객체 만들기 : 컬럼 이름을 포함하고 있는 1차원 String 배열과 셀의 데이터인 2차원 Object 배열을 생성

 

◎ 테이블 생성 예제

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class JTableExample extends JFrame {
	private JTable jTable;
	
	public JTableExample() {
		this.setTitle("JTableExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getJTable()),
				BorderLayout.CENTER);
		this.setSize(200, 125);
	}
	
	public JTable getJTable() {
		if(jTable == null) {
			String[] columnNames = { "이름", "나이" };
			Object[][] rowData = {
					{"춘삼월", 25},
					{"하여름", 23},
					{"하바다", 26},
					{"추가을", 22},
					{"동겨울", 27},
					{"동장군", 15}
			};
			jTable = new JTable(rowData, columnNames);
			jTable.getColumn("이름").setPreferredWidth(100);
			jTable.getColumn("나이").setPreferredWidth(50);
		}
		return jTable;
	}
	
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTableExample jFram = new JTableExample();
				jFram.setVisible(true);
			}
		});
	}
}

 

 

 

(2) 테이블 모델

   ▷ TableModel 객체를 사용해 컬럼과 셀의 데이터를 관리

   ▷ 테이블 생성시 컬럼 이름인 1차원 배열, 셀의 데이터인 2차원 배열을 생성자로 넘기면 TableModel이 내부적으로 생성되고 데이터들을 관리함

   ▷ 내부적으로 생성된 TableModel을 프로그램에서 사용할 수 있도록 getModel() 메소드를 제공

 

◎ getModel() 메소드

NO 타입 메소드 용도
1 int getColumnCount() 총 컬럼의 수 얻기
2 String getColumnName(int columnIndex) 컬럼의 이름 얻기
3 int getRowCount() 총 행의 수 얻기
4 Object getValueAt(int rowIndex, int columnIndex) 셀의 데이터 얻기
5 void setValueAt(Object aValue, int rowIndex, int columnIndex) 셀의 데이터 변경
6 void setDataVector(Object[][] rows, Object[] columnNames)
setDataVector(Vector rows, Vector columnNames);
전체 테이블 데이터를 주어진
매개값으로 대체

 

◎ 테이블 모델 생성 및 출력 예제

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableModel;

public class JTableExample2 extends JFrame {
	private JTable jTable;
	private JButton btnInfo;
	
	public JTableExample2() {
		this.setTitle("JTableExample2");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getJTable()),
				BorderLayout.CENTER);
		this.getContentPane().add(getBtnInfo(),	BorderLayout.SOUTH);		
		this.setSize(200, 200);
	}
	
	public JTable getJTable() {
		if(jTable == null) {
			String[] columnNames = { "이름", "나이" };
			Object[][] rowData = {
					{"춘삼월", 25},
					{"하여름", 23},
			};
			jTable = new JTable(rowData, columnNames);
		}
		return jTable;
	}
	
	public JButton getBtnInfo() {
		if(btnInfo == null) {
			btnInfo = new JButton();
			btnInfo.setText("테이블 정보 출력");
			
			btnInfo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// 테이블 모델 객체 생성
					TableModel tableModel = getJTable().getModel();
					
					// 전체 컬럼 수
					int columnCount = tableModel.getColumnCount();
					
					// 전체 행 수
					int rowCount = tableModel.getRowCount();
					
					// 컬럼 이름 출력
					for(int i=0; i<columnCount; i++) {
						String columnName = tableModel.getColumnName(i);
						System.out.print(columnName + "\t\t");
					}
					
					System.out.println();
					System.out.println("-------------------------");
					
					// 행의 데이터 출력
					for(int i=0; i<rowCount; i++) {
						String column0 = (String) tableModel.getValueAt(i, 0);
						Integer column1 = (Integer) tableModel.getValueAt(i, 1);
						System.out.println(column0 + "\t\t" + column1);
					}
					
					// 1행 셀 데이터 변경
					tableModel.setValueAt("개나리", 0, 0);
					tableModel.setValueAt(20, 0, 1);
				}
			});
		}
		return btnInfo;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTableExample2 jFram = new JTableExample2();
				jFram.setVisible(true);
			}
		});
	}
}

 

 

(3) 셀 표현 변경

   ▷ 컬럼 헤더와 셀 텍스트 내용을 수평 정렬하거나 셀 내용으로 다양한 컴포넌트를 넣을 때 새로운 셀 렌더러를 정의

   ▷ 셀 렌더러는 넣고 싶은 컴포넌트를 상속하고 TableCellRenderer 인터페이스를 구현해서 만듬

   ▷ getTableCellRendererComponent() 메소드는 상속받은 컴포넌트를 매개값으로 초기화하고 리턴

 

◎ getTableCellRendererComponent() 메소드 매개변수

NO 매개변수 값 또는 참조
1 table 셀을 포함하고 있는 JTable
2 value 셀에 표시될 데이터
3 isSelected 셀을 포함하고 있는 행이 선택 되었는지 여부
4 hasFocus 셀에 포커스가 있는지 여부
5 row 셀을 포함하고 있는 행의 순번
6 column 셀을 포함하고 있는 컬럼의 순번

 

◎ 셀 표현 변경 예제(마우스로 행을 선택하면 노란색 배경으로 변경)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class JTableExample3 extends JFrame {
	private JTable jTable;
	
	public JTableExample3() {
		this.setTitle("JTableExample3");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getJTable()),
				BorderLayout.CENTER);
		this.setSize(200, 125);
	}
	
	// JTable 생성
	public JTable getJTable() {
		if(jTable == null) {
			String[] columnNames = { "이름", "나이", "선택" };
			Object[][] rowData = {
					{"춘삼월", 25, false},
					{"하여름", 26, true},
					{"추가을", 22, false},
					{"동겨울", 27, true}					
			};
			jTable = new JTable(rowData, columnNames);
			
			// 각 컬럼의 셀 렌더러 변경
			TableColumn tcName = jTable.getColumn("이름");
			tcName.setCellRenderer(new NameTableCellRenderer());
			TableColumn tcAge = jTable.getColumn("나이");
			tcAge.setCellRenderer(new AgeTableCellRenderer());
			TableColumn tcSelect = jTable.getColumn("선택");
			tcSelect.setCellRenderer(new SelectTableCellRenderer());
		}
		return jTable;
	}
	
	// 이름 컬럼의 셀 렌더러 정의
	public class NameTableCellRenderer extends JLabel implements TableCellRenderer{
		public Component getTableCellRendererComponent(
				JTable table, Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			setText(value.toString());
			setFont(new Font(null, Font.PLAIN, 12));
			setHorizontalAlignment(JLabel.CENTER);
			setOpaque(true); // JLabel의 배경을 불투명하게 설정
			if(isSelected) {
				setBackground(Color.yellow);
			} else {
				setBackground(Color.white);
			}
			return this;
		}
	}
	
	// 나이 컬럼의 셀 렌더러 정의
	public class AgeTableCellRenderer extends JLabel implements TableCellRenderer{
		public Component getTableCellRendererComponent(
				JTable table, Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			int age = ((Integer) value).intValue();
			
			if(age <= 25) {
				setIcon(new ImageIcon(getClass().getResource("key.gif")));
			} else {
				setIcon(new ImageIcon(getClass().getResource("start.gif")));				
			}
			setText(value.toString());
			setFont(new Font(null, Font.PLAIN, 12));
			setHorizontalAlignment(JLabel.CENTER);
			setOpaque(true); // JLabel의 배경을 불투명하게 설정
			if(isSelected) {
				setBackground(Color.yellow);
			} else {
				setBackground(Color.white);
			}
			return this;
		}
	}
	
	// 이름 컬럼의 셀 렌더러 정의
	public class SelectTableCellRenderer extends JCheckBox implements TableCellRenderer{
		public Component getTableCellRendererComponent(
				JTable table, Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			Boolean boolWrapper = (Boolean) value;
			setSelected(boolWrapper.booleanValue());
			setHorizontalAlignment(CENTER);			
			if(isSelected) {
				setBackground(Color.yellow);
			} else {
				setBackground(Color.white);
			}
			return this;
		}
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTableExample3 jFram = new JTableExample3();
				jFram.setVisible(true);
			}
		});
	}
}

 

 

JTable을 이용해 테이블 모양을 만들어보았습니다!

 

Swing으로 정말 간편하게 테이블을 표현할 수 있네요! 더 많은 기능들에 대해서 배워볼게요~!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형