본문 바로가기

BackEnd/Java

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

728x90
반응형

(4) 이벤트 처리

   ▷ MouseEvent가 발생하므로 MouseListener를 등록해서 이벤트를 처리할 수 있음

   ▷ getSelectedColumn(), getSelectedRow() 메소드를 이용해 어떤 컬럼과 행에서 클릭되었는지 알아낼 수 있음

 

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.TableModel;

public class JTableExample4 extends JFrame {
	private JTable jTable;
	private JPanel pSouth;
	private JTextField txtName;
	private JTextField txtAge;
	private Object[][] rowData;
	
	public JTableExample4() {
		this.setTitle("JTableExample4");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getJTable()),
				BorderLayout.CENTER);		
		this.getContentPane().add(getPSouth(), BorderLayout.SOUTH);
		this.setSize(200, 230);
	}
	
	// JTable 생성
	public JTable getJTable() {
		if(jTable == null) {
			String[] columnNames = new String[] { "이름", "나이" };
			rowData = new Object[][] {
					{"춘삼월", 25},
					{"하여름", 26},
					{"추가을", 22},
					{"동겨울", 27}					
			};
			jTable = new JTable(rowData, columnNames);
			
			// MouseEvent 처리
			jTable.addMouseListener(new MouseAdapter() {
				public void mouseClicked(MouseEvent e) {
					int rowIndex = jTable.getSelectedRow();
					if(rowIndex != -1) {  // -1이 아니면 선택한 행이 있음
						//선택한 행의 셀 값 읽어 들이기
						TableModel tableModel = jTable.getModel();
						String name = (String) tableModel.getValueAt(rowIndex, 0);
						Integer age = (Integer) tableModel.getValueAt(rowIndex, 1);
						
						// 읽은 값을 아래쪽에 있는 JPanel에서 보여주기
						getTxtName().setText(name);
						getTxtAge().setText(String.valueOf(age.intValue()));
					}
				}
			});
			
		}
		return jTable;
	}
	
	// 하단에 위치할 JPanel 생성
	public JPanel getPSouth() {
		if(pSouth == null) {
			pSouth = new JPanel();
			pSouth.setLayout(new GridLayout(4, 2));
			pSouth.add(new JLabel("[선택한 행 정보]"));
			pSouth.add(new JLabel(""));			
			pSouth.add(new JLabel("이름", JLabel.CENTER));
			pSouth.add(getTxtName());
			pSouth.add(new JLabel("나이", JLabel.CENTER));
			pSouth.add(getTxtAge());
		}
		return pSouth;
	}

	public JTextField getTxtName() {
		if(txtName == null) {
			txtName = new JTextField();
		}
		return txtName;
	}
	
	public JTextField getTxtAge() {
		if(txtAge == null) {
			txtAge = new JTextField();
		}
		return txtAge;
	}
	
		
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTableExample4 jFram = new JTableExample4();
				jFram.setVisible(true);
			}
		});
	}
}

 

 

 

(5) 행 추가, 수정, 삭제

 ▷ JTable (Object[ ][ ] rowData, String[ ] columnNames ) 생성자로 만들 경우 AbstractTableModel을 상속해서 만들어지 고, 매개변수가 없는 JTable ( ) 생성자로 만들었다면 내부적으로 DefaultTableMode을 상속해서 만듬

 

◎ 행 추가, 삽입, 삭제할 수 있는 메소드

NO 타입 메소드 용도
1 void addRow(Object[ ][ ] rowData)
addRow(Vector rowData)
맨 뒤에 행 추가
2 void insertRow(int rowIndex, Object[ ][ ] rowData)
insertRow(int rowIndex, Vector rowData)
주어진 인덱스에 행 삽입
3 void removeRow(int rowIndex) 주어진 인덱스의 행 삭제

 

◎ 사용자가 입력한 내용을 JTable의 행으로 삽입, 수정, 삭제하는 예제

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class JTableExample5 extends JFrame {
	private JTable jTable;
	private JPanel pSouth;
	private JTextField txtName, txtAge;
	private JButton btnInsert, btnUpdate, btnDelete;
	
	public JTableExample5() {
		this.setTitle("JTableExample5");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getJTable()),
				BorderLayout.CENTER);		
		this.getContentPane().add(getPSouth(), BorderLayout.SOUTH);
		this.setSize(250, 250);
	}
	
	// JTable 생성
	public JTable getJTable() {
		if(jTable == null) {
			jTable = new JTable();
			final DefaultTableModel tableModel =
					(DefaultTableModel) jTable.getModel();
			tableModel.addColumn("이름");
			tableModel.addColumn("나이");
			
			// 행을 선택했을 때 이벤트 처리
			jTable.addMouseListener(new MouseAdapter() {
				public void mouseClicked(MouseEvent e) {
					int rowIndex = jTable.getSelectedRow();
					if(rowIndex != -1) {
						String name = (String) tableModel.getValueAt(rowIndex, 0);
						String age = (String) tableModel.getValueAt(rowIndex, 1);
						txtName.setText(name);
						txtAge.setText(age.toString());
					}
				}
			});			
		}
		return jTable;
	}
	
	// 하단에 위치할 JPanel 생성
	public JPanel getPSouth() {
		if(pSouth == null) {
			pSouth = new JPanel();
			
			pSouth.setLayout(new GridLayout(3, 1));
			
			JPanel pNameInput = new JPanel();
			pNameInput.setLayout(new GridLayout(1,2));
			pNameInput.add(new JLabel("이름", JLabel.CENTER));
			pNameInput.add(getTxtName());
			pSouth.add(pNameInput);
			
			JPanel pAgeInput = new JPanel();
			pAgeInput.setLayout(new GridLayout(1,2));
			pAgeInput.add(new JLabel("나이", JLabel.CENTER));
			pAgeInput.add(getTxtAge());
			pSouth.add(pAgeInput);
			
			JPanel pButton = new JPanel();
			pButton.add(getBtnInsert());
			pButton.add(getBtnUpdate());
			pButton.add(getBtnDelete());
			pSouth.add(pButton);
		}
		return pSouth;
	}
	
	public JTextField getTxtName() {
		if(txtName == null) {
			txtName = new JTextField();
		}
		return txtName;
	}
	
	public JTextField getTxtAge() {
		if(txtAge == null) {
			txtAge = new JTextField();
		}
		return txtAge;
	}
	
	// 행 삽입 버튼 생성
	public JButton getBtnInsert() {
		if(btnInsert == null) {
			btnInsert = new JButton();
			btnInsert.setText("추가");
			btnInsert.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					Object[] rowData = { txtName.getText(), txtAge.getText() };
					DefaultTableModel tableModel = (DefaultTableModel)
							getJTable().getModel();
					tableModel.addRow(rowData);
					txtName.setText("");
					txtAge.setText("");
				}
			});
		}
		return btnInsert;
	}
	
	// 행 삭제 버튼 생성
	public JButton getBtnUpdate() {
		if(btnUpdate == null) {
			btnUpdate = new JButton();
			btnUpdate.setText("수정");
			btnUpdate.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// 테이블 모델을 디폴트 테이블모델로 형 변환
					DefaultTableModel tableModel = (DefaultTableModel)
							getJTable().getModel();
					Vector<Vector> rows = tableModel.getDataVector();
					Vector row = rows.elementAt(jTable.getSelectedRow());
					row.set(0, txtName.getText());
					row.set(1, txtAge.getText());
					tableModel.fireTableDataChanged();
					txtName.setText("");
					txtAge.setText("");
				}
			});
		}
		return btnUpdate;
	}
	
	// 행 삭제 버튼 생성
	public JButton getBtnDelete() {
		if(btnDelete == null) {
			btnDelete = new JButton();
			btnDelete.setText("삭제");
			btnDelete.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// 사용자가 몇 번째 행을 선택했는지 확인
					int rowIndex = getJTable().getSelectedRow();
					if(rowIndex != -1) {
						// 테이블 모델을 디폴트 테이블모델로 형 변환
						DefaultTableModel tableModel = (DefaultTableModel)
								getJTable().getModel();
						tableModel.removeRow(rowIndex);
						// 텍스트 필더 내요을 초기화(비워두기)
						txtName.setText("");
						txtAge.setText("");
					}
				}
			});
		}
		return btnDelete;
	}
		
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTableExample5 jFram = new JTableExample5();
				jFram.setVisible(true);
			}
		});
	}
}

 

 

JTable을 이용해 테이블을 만들고 입력/출력 처리, 마우스 효과 등을 추가해보았습니다.

 

다양한 메소드들을 사용하니 출력 화면에 더 많은 효과를 넣을 수 있네요! 더 많은 기능들에 대해서 배워볼게요~!!

 

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

 

 

728x90
반응형