Java DefaultTableModel

2023. 2. 3. 18:58Java

 


javax.swing.table.DefaultTableModel.DefaultTableModel(Object[] columnNames, int rowCount)

DefaultTableModel 클래스으 DefaultTableModel(Object[] columnNames, int rowCount) 생성자 함수는

Object[] columnNames 파라메터 안에 있는 요소들의 수만큼의 열과

int rowCount 파라메터 수 만큼의 null 객체 값들로 채워진 행들로 이루어진

하나의 DefaultTableModel 객체를 생성한다.

각 열 이름은 Object[] columnNames 배열 파라메터에서 가져올 것이다.

 

DefaultTableModel 클래스는

cell(작은 방) 값 객체들을 저장하기 위해서 

Vector들중의 한개의 Vector 를 사용하는

TableModel 클래스의 구현체이다.

 


프로젝트 내 src 내 javabasic 패키지 내 Ex4TableModel.java

package javabasic;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Vector;

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

public class Ex4TableModel extends JFrame {
	DefaultTableModel model;
	JTable table;
	JTextField txtName, txtJava, txtSpring;
	JButton btnAdd, btnDelete;

	String[] title = { "Name", "Java", "Spring", "Total", "Average" };
//	final String fileName = "C:\\java0901\\sungjuk.txt"; // 정상동작.
	String fileName = "C:\\java0901\\sungjuk.txt"; // 이렇게 해도된다.

	public Ex4TableModel(String title) {
		// TODO Auto-generated constructor stub
		super(title);
		this.setBounds(700, 100, 400, 400);// 시작위치x,y,크기 w,h
		// super로 해도 되고 this로 해도 됨 super는 조상
		// this로 해도 상속을 받아서 괜찮음
		// this.getContentPane().setBackground(Color.orange);//프레임위에 있는 패널의 색상 변경
		this.getContentPane().setBackground(new Color(211, 225, 208));// 프레임위에 있는 패널의 색상 변경
		this.setDesign();// 디자인 코드
		this.writeData();// 테이블에 파일내용 불러오기
		this.setVisible(true);// 보이게 하기
//		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//프로그램을 종료해주는 메서드

//		종료시 테이블의 데이타를 파일에 저장
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
//				파일저장
//				총 행갯수: model.getRowCount()
//				FileWriter fw=null;
//				try {
//					fw=new FileWriter(fileName);
//					for(int i=0;i<model.getRowCount();i=i+1)
//					{
//						for(int j=0;j<3;j=j+1)
//						{
//							if(j!=2)
//							{
//								fw.write(model.getValueAt(i, j)+",");
//							}else
//							{
//								fw.write(model.getValueAt(i, j)+"\n");
//							}
//						}
//					}
//				} catch (IOException e1) {
//					// TODO Auto-generated catch block
//					e1.printStackTrace();
//				}finally {
//					if(fw!=null)
//						try {
//							fw.close();
//						} catch (IOException e1) {
//							// TODO Auto-generated catch block
//							e1.printStackTrace();
//						}
//				}
//				

				FileWriter fw = null;
				try {
					fw = new FileWriter(fileName);
					for (int i = 0; i < model.getRowCount(); i = i + 1)// 행갯수
					{
//							행단위로 저장할 변수 선언
						String line = "";
						for (int j = 0; j < model.getColumnCount(); j = j + 1)// 열갯수
						{
							line = line + model.getValueAt(i, j).toString() + ",";
						}
//							맨 마지막 컴마는 제거
						line = line.substring(0, line.length() - 1);
//							파일에 저장
						fw.write(line + "\n");
					}
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} finally {
					try {
						fw.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}

//				시스템 종료
				System.exit(0);
				super.windowClosing(e);
			}

		});
	}

//	파일에서 데이타 가져와서 테이블에 출력
	public void writeData() {
//		FileReader fr=null;
//		BufferedReader br=null;
//		
//		try {
//			fr=new FileReader(fileName);
//			br=new BufferedReader(fr);
//			
//			while(true)
//			{
//				String line=br.readLine();
//				
//			}
//		} catch (FileNotFoundException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}finally {
//			if(br!=null)
//				try {
//					br.close();
//				} catch (IOException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//			if(fr!=null)
//				try {
//					fr.close();
//				} catch (IOException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//		}

//		파일에서 불러오기
		FileReader fr = null;
		BufferedReader br = null;

		try {
			fr = new FileReader(fileName);
			br = new BufferedReader(fr);
			while (true) {
//				파일에서 한줄 읽기
				String line = br.readLine();
//				널값이면 종료
				if (line == null)
					break;
//				, 로 분리
				String[] data = line.split(",");
//				model에 추가
				model.addRow(data);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(this, "불러올 파일이 없습니다");
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} finally {
			try {
				if (br != null)
					br.close();
				if (fr != null)
					fr.close();
			} catch (IOException e) {
				// TODO: handle exception
			}
		}

	}

	public void setDesign() {
		this.setLayout(null);
//		입력 텍스트필드
		JLabel lbl1 = new JLabel("Name");
		lbl1.setBounds(10, 20, 50, 30);
		this.add(lbl1);

		txtName = new JTextField();
		txtName.setBounds(60, 20, 60, 30);
		this.add(txtName);

		JLabel lbl2 = new JLabel("Java");
		lbl2.setBounds(130, 20, 50, 30);
		this.add(lbl2);

		txtJava = new JTextField();
		txtJava.setBounds(160, 20, 60, 30);
		this.add(txtJava);

		JLabel lbl3 = new JLabel("Spring");
		lbl3.setBounds(230, 20, 50, 30);
		this.add(lbl3);

		txtSpring = new JTextField();
		txtSpring.setBounds(280, 20, 60, 30);
		this.add(txtSpring);

		// 버튼
		btnAdd = new JButton("데이타추가");
		btnAdd.setBounds(30, 60, 100, 30);
		this.add(btnAdd);

		btnDelete = new JButton("데이타삭제");
		btnDelete.setBounds(200, 60, 100, 30);
		this.add(btnDelete);

//		테이블
		model = new DefaultTableModel(title, 0);
		table = new JTable(model);
		JScrollPane jsp = new JScrollPane(table);
		jsp.setBounds(20, 120, 350, 190);
		this.add(jsp);

//		추가 이벤트
		btnAdd.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String name = txtName.getText();
				String java = txtJava.getText();
				String spring = txtSpring.getText();

				try {
					// 밑줄에서 parseInt(String s) 메서드 에서 문자열을 입력할 때에도
					// 정수형식으로 입력해야 예외가 발생하지 않는다. 50.56 이나 37.5910223 과 같은
					// 실수형식으로 입력해도 예외가 발생한다. 50.56 이라는 문자열을 파싱하려고 할 때
					// 중간에 . 기호가 들어가서 발생하는 듯 하다..
					int tot = Integer.parseInt(java) + Integer.parseInt(spring);
					double avg = tot / 2.0;
//					1.String 배열 타입으로 추가하는 방법
//					전체 데이타를 String 배열타입으로 만들기
//					String []data= {name,java,spring,String.valueOf(tot),String.valueOf(avg)};
//					테이블 모델에 추가
//					model.addRow(data);

//					2. Vector 타입으로 추가하는 방법
//					Vector<String> vS;
//					vS.add(name);
//					vS.add(java);
//					vS.add(spring);
//					vS.add(String.valueOf(tot));

					Vector<String> data = new Vector<String>();
					data.add(name);
					data.add(java);
					data.add(spring);
					data.add(String.valueOf(tot));
					data.add(String.valueOf(avg));
					model.addRow(data);

//					입력값 지우기
					txtName.setText("");
					txtJava.setText("");
					txtSpring.setText("");
				} catch (NumberFormatException e1) {
					// txtJava 나 txtSpring 에 아무 것도 입력을 하지 않으면 공백이 되어서
					// 공백을 정수로 파싱할 수 없어 예외가 발생한다.
					JOptionPane.showMessageDialog(Ex4TableModel.this, "점수에 문자가 섞여있네요");
					return;// 메서드 종료
					// TODO: handle exception
				}
			}
		});

//		삭제 버튼 이벤트
		btnDelete.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				int selectRow = table.getSelectedRow();// 선택하면 행번호 반환, 안하면 -1 반환
				System.out.println(selectRow);
				if (selectRow == -1) {
//					삭제할 행을 아예 선택하지 않았을 때도 -1 을 반환받지만
//					DefaultTableModel 객체 내 (여기서는 table) 에
//					저장된 행값이 아무것도 없을 때는 출력된 테이블을 클릭해도
//					선택조차 되지 않아서 -1을 반환받는다.
					JOptionPane.showMessageDialog(Ex4TableModel.this, "삭제할 행을 선택해주세요");
				} else {
//					삭제
					model.removeRow(selectRow);
				}

			}
		});
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Ex4TableModel("Table 데이타 관리");
	}

}

 

'Java' 카테고리의 다른 글

Java JScrollBar  (0) 2023.02.05
Java WindowAdapter  (1) 2023.02.03
Java JTable  (1) 2023.02.03
Java JComboBox  (0) 2023.02.03
Java Choice  (0) 2023.02.03