toggle menu

JAVA 정리 - JTable

2012.08.08 09:07 JAVA

자바의 GUI 요소 중 JTable 을 사용한 예제이다.
JTable을 통해 표 형식의 데이터를 효과적으로 보여줄 수 있다.


간단한 JTable 사용예제
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class JTableExam
{
	JFrame jFrame = new JFrame("JTable 예제");

	String columnNames[] =
	{ "상품번호", "상품이름", "상품가격", "상품설명" };

	Object rowData[][] =
	{
	{ 1, "맛동산", 100, "오리온" },
	{ 2, "아폴로", 200, "불량식품" },
	{ 3, "칸쵸코", 300, "과자계의 레전드" } };

	JTable jTable = new JTable(rowData, columnNames);
	JScrollPane jScollPane = new JScrollPane(jTable);

	public JTableExam()
	{
		jFrame.add(jScollPane);

		jFrame.setSize(400, 300);
		jFrame.setVisible(true);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	public static void main(String[] args)
	{
		new JTableExam();
	}
}








DefaultTableModel

디폴트 테이블 모델을 생성 후에 JTable에 넣어줄 수 있다.
JTable은 GUI 요소이고 여기에 들어갈 데이터는 앞서 2차원 배열로 표현해주었는데,
2차원 배열은 여러모로 유동적으로 다루기 어려운 부분이 많다.
이러한 불편함을 DefaultTableModel 이라는 객체를 통해 해소시켜 줄 수 있다.


간단한 DefaultTableModel 사용예제
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class JTableExam
{
	JFrame jFrame = new JFrame("JTable 예제");

	String columnNames[] =
	{ "상품번호", "상품이름", "상품가격", "상품설명" };

	Object rowData[][] =
	{
	{ 1, "맛동산", 100, "오리온" },
	{ 2, "아폴로", 200, "불량식품" },
	{ 3, "칸쵸코", 300, "과자계의 레전드" } };
	
	
	//DefaultTableModel을 선언하고 데이터 담기
	DefaultTableModel defaultTableModel = new DefaultTableModel(rowData, columnNames);

	//JTable에 DefaultTableModel을 담기
	JTable jTable = new JTable(defaultTableModel);
	
	//JScrollPane에 JTable을 담기
	JScrollPane jScollPane = new JScrollPane(jTable);

	public JTableExam()
	{
		jFrame.add(jScollPane);
		
		//행 한줄 추가!
		Object [] temporaryObject = { 4, "초코송이", 500, "식품계의 절대강자" };
		defaultTableModel.addRow(temporaryObject);
		
		//행과 열 갯수 구하기
		System.out.println(defaultTableModel.getRowCount());
		System.out.println(defaultTableModel.getColumnCount());
		
		//컬럼(열)의 index는 0부터 시작한다!!
		System.out.println(defaultTableModel.getColumnName(0));
		
		//0행을 삭제하면 제목행을 제외하고 첫째행을 삭제한다!!
		defaultTableModel.removeRow(0);
		
		//값을 얻어올 때도 0부터 index가 시작된다는 것에 주의한다!!
		System.out.println(defaultTableModel.getValueAt(2, 2));
		
		//특정 좌표의 값을 바꾸는 것은 setValueAt()
		defaultTableModel.setValueAt("5000", 2, 2);
		
		//테이블에 Row를 미리 선택한 상태로 만들기!
		jTable.setRowSelectionInterval(1, 1);

		jFrame.setSize(500, 300);
		jFrame.setVisible(true);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	public static void main(String[] args)
	{
		new JTableExam();
	}
}





DB와 연동해서 데이터 입출력을 수행하는 JTable 예제

실제 데이터베이스와 연동해서 데이터 입출력을 수행하는 예제이다.
앞서 배운 DefaultTableModel은 사실 이러한 DB연동 때에 큰 힘을 발휘한다.



DB관련 기본값을 선언한 Class
public class DatabaseConstant
{
	public final static String DRIVERNAME = "oracle.jdbc.driver.OracleDriver";
	public final static String URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
	public final static String USER = "scott";
	public final static String PASSWORD = "tiger";
}





메인 프로그램 Class
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class MenuExam
{
	// *** DB 관련 변수 선언 ***
	
	Connection connection;
	PreparedStatement preparedStatement;
	Statement statement;
	ResultSet resultSet;
	
	
	
	// *** 상수 선언 ***
	
	public final int SEARCH_ID = 0;
	public final int SEARCH_NAME = 1;
	public final int SEARCH_ADDR = 2;
	public final int SEARCH_ALL = 3;
	public final int SEARCH_NONE = 4;

	
	public final int NEW_MODE = 1;
	public final int EDIT_MODE = 2;
	
	
	
	// *** 메인 UI 관련 변수 선언 ***
	
	// 프레임 선언
	JFrame jFrame = new JFrame("DB연동");
	
	
	//DefaultTableModel을 선언하고 데이터 담기
	DefaultTableModel defaultTableModel = new DefaultTableModel(new String[] { "ID", "Name", "Age", "Address" }, 0)
	{
		@Override
		public boolean isCellEditable(int row, int column)
		{
			return false;
		}
		
	};

	//JTable에 DefaultTableModel을 담기
	JTable jTable = new JTable(defaultTableModel);
	
	// Swing에서 스크롤바를 넣기 위해 아래와 같이 사용한다.
	JScrollPane jScrollPane = new JScrollPane(jTable);// 스크롤바 만들기

	// 검색어를 입력할 입력창
	JTextField jTextField = new JTextField(20);
	
	// 검색 버튼
	JButton jButton = new JButton("검색");
	
	// 콤보 박스
	JComboBox<String> jComboBox = new JComboBox<String>(new String[] {"ID", "Name", "Address", "전체검색"}); 
	
	// 메뉴 선언
	JMenuBar menuBar = new JMenuBar();
	JMenu adminMenu = new JMenu("관리");
	
	// 패널 선언
	JPanel jPanel = new JPanel(new FlowLayout());

	
	/**
	 * [MenuExam 클래스의 생성자]
	 * GUI를 생성하고 DB에 테이블 존재 여부를 확인해 없을 경우 생성한다.
	 * 전체 멤버 목록을 출력해주는 메소드를 호출한다.
	 */
	public MenuExam()
	{
		// *** 메인 UI 설정 ***
		
		// 관리 메뉴 생성
		adminMenu.add(new JMenuItem("가입"));
		adminMenu.add(new JMenuItem("수정"));
		adminMenu.add(new JMenuItem("삭제"));
		adminMenu.addSeparator(); //구분선 추가
		adminMenu.add(new JMenuItem("종료"));
		
		// 메뉴를 메뉴바에 등록
		menuBar.add(adminMenu);

		// 메뉴바 추가
		jFrame.setJMenuBar(menuBar);
		
		// 테이블 추가
		jTable.getTableHeader().setReorderingAllowed(false); //테이블 컬럼 순서 변경 금지
		jFrame.add(jScrollPane);
				
		// 하단 패널에 컴포넌트 추가
		jPanel.add(jComboBox);
		jPanel.add(jTextField);
		jPanel.add(jButton);
		
		// 하단 패널 추가
		jFrame.add(jPanel, "South");
		
		// 프레임 크기 및 보이기 설정
		jFrame.setSize(600, 400);
		jFrame.setResizable(false);
		jFrame.setVisible(true);
		jFrame.setLocationRelativeTo(null);

		// swing에만 있는 X버튼 클릭시 종료
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		
		// *** DB 연결 ***
		
		try
		{
			// ① 로드
			Class.forName(DatabaseConstant.DRIVERNAME);
			 

			
			
			// *** DB 생성 ***
			
			// ② 연결
			connection = DriverManager.getConnection(DatabaseConstant.URL, DatabaseConstant.USER, DatabaseConstant.PASSWORD);
 
			// ② 연결 [Statement]
			statement = connection.createStatement();
 
			// ③ 실행 [CRUD]
			resultSet = statement.executeQuery("SELECT COUNT(TABLE_NAME) FROM USER_TABLES WHERE TABLE_NAME='MEMBER'");
			
			int result = 0;
			
			if(resultSet.next())
			{
				result = Integer.valueOf(resultSet.getString(1));
			}
			
			// 테이블이 생성되지 않은 경우 생성!
			if( result == 0 )
			{
				statement.executeUpdate("CREATE TABLE MEMBER ( ID VARCHAR2(30) PRIMARY KEY NOT NULL, NAME VARCHAR2(20) NOT NULL, AGE NUMBER(3) NOT NULL, ADDR VARCHAR2(100) NOT NULL )");
			}
			// 테이블이 존재하는 경우 데이터 가져와 출력하기
			else
			{
				searchMember(SEARCH_NONE, null);
			}
			 
		}
		catch (ClassNotFoundException e)
		{
			System.out.println("[로드 오류]\n" + e.getStackTrace());
		}
		catch (SQLException e)
		{
			System.out.println("[연결 오류]\n" +  e.getStackTrace());
		}
		
		finally
		{
			closeDatabase();
		}
		
		
		
		
		
		// *** 이벤트 설정 ***
		
		//가입 메뉴
		adminMenu.getItem(0).addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				//다이얼로그 띄우기
				MemberDialog memberDialog = new MemberDialog();
				memberDialog.jDialog.setModal(true);
				memberDialog.jDialog.setVisible(true);
			}			
		});

		//수정 메뉴
		adminMenu.getItem(1).addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				//여러 컬럼을 선택하는 경우와 선택하지 않은 경우를 고려
				switch( jTable.getSelectedRowCount() )
				{
					case 0:
						JOptionPane.showMessageDialog(jFrame, "선택된 컬럼이 없습니다.");
					break;
					
					case 1:
						
						//DefaultTableModel에서 선택한 컬럼의 값들을 가져오기
						String id = String.valueOf(defaultTableModel.getValueAt(jTable.getSelectedRow(), 0));
						String name = String.valueOf(defaultTableModel.getValueAt(jTable.getSelectedRow(), 1));
						int age = Integer.valueOf((String) defaultTableModel.getValueAt(jTable.getSelectedRow(), 2));
						String addr = String.valueOf(defaultTableModel.getValueAt(jTable.getSelectedRow(), 3));
						
						//다이얼로그 띄우기
						MemberDialog memberDialog = new MemberDialog(id, name, age, addr);
						memberDialog.jDialog.setModal(true);
						memberDialog.jDialog.setVisible(true);
					break;
					
					default:
						JOptionPane.showMessageDialog(jFrame, "하나의 컬럼만 선택해주세요.");
					break;
				}
			}			
		});
		
		//삭제 메뉴
		adminMenu.getItem(2).addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				//하나 이상의 컬럼이 선택된 경우
				if( jTable.getSelectedRowCount() > 0 )
				{
					if( JOptionPane.showConfirmDialog(jFrame, "선택된 컬럼들을 삭제합니까?", "삭제 확인", 0) == 0 )
					{
						//선택된 멤버들을 삭제
						for(int i : jTable.getSelectedRows())
						{
							deleteMember(String.valueOf(defaultTableModel.getValueAt(i, 0)));
						}
						
						//내용 업데이트
						searchMember(SEARCH_NONE, null);
					}
				}
				else
				{
					JOptionPane.showMessageDialog(jFrame, "선택된 컬럼이 없습니다.");
				}
		
				
			}			
		});
		
		//종료 메뉴
		adminMenu.getItem(4).addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent e)
			{
				if( JOptionPane.showConfirmDialog(MenuExam.this.jFrame, "종료합니다.", "종료 확인", 0) == 0 )
				{
					System.exit(0);
				}

			}			
		});
		
		
		//검색 버튼
		jButton.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				if(jButton.getText().equals("검색"))
				{
				
					if( jTextField.getText().trim().length() > 0 )
					{
	
						switch( jComboBox.getSelectedIndex() )
						{
							//아이디
							case SEARCH_ID:
								searchMember(SEARCH_ID, jTextField.getText().trim());
							break;
	
								
							//이름
							case SEARCH_NAME:
								searchMember(SEARCH_NAME, jTextField.getText().trim());
							break;
							
							
							//주소
							case SEARCH_ADDR:
								searchMember(SEARCH_ADDR, jTextField.getText().trim());
							break;
							
							//전체
							case SEARCH_ALL:
								searchMember(SEARCH_ALL, jTextField.getText().trim());
							break;
						}
						
						jButton.setText("취소");
					}
					else
					{
						JOptionPane.showMessageDialog(jFrame, "검색어를 입력해주세요!");
					}
				}
				
				else
				{
					//검색 초기화
					searchMember(SEARCH_NONE, null);
				}

			}			
		});
		

		
	}
	
	
	
	/**
	 * [데이터베이스를 닫는 메소드]
	 * connection, statement, resultSet의 null 여부를 체크한뒤 담겨있을 경우 닫아준다.
	 * @param 없음
	 * @return 없음
	 */
	public void closeDatabase()
	{
		try
		{
			if( connection != null )
			{
				connection.close();
			}
			 
			if( statement != null )
			{
				statement.close();
			}
			 
			if( resultSet != null )
			{
				resultSet.close();
			}
		}
		catch (SQLException e)
		{
			System.out.println("[닫기 오류]\n" +  e.getStackTrace());
		}
	}
	
	
	
	
	/**
	 * ID 중복 체크 메소드
	 * 파라메터로 입력받은 id값을 member 테이블의 id 필드에서 검색해서 1개라도 존재하면 true를 리턴하는 메소드
	 * @param id 아이디
	 * @return 중복되는 id가 존재할 경우 true, 없으면 false
	 */
	public boolean idCheck(String id)
	{
		int result = 0;
		
		try
		{
			// ② 연결
			connection = DriverManager.getConnection(DatabaseConstant.URL, DatabaseConstant.USER, DatabaseConstant.PASSWORD);
 
			// ② 연결 [Statement]
			statement = connection.createStatement();
 
			// ③ 실행 [CRUD]
			resultSet = statement.executeQuery("SELECT COUNT(id) FROM MEMBER WHERE ID='"+ id + "'");
			
			if(resultSet.next())
			{
				result = Integer.valueOf(resultSet.getString(1));
			}
			 
		}
		catch (SQLException e)
		{
			System.out.println("[연결 오류]\n" +  e.getStackTrace());
		}
		
		finally
		{
			closeDatabase();
		}
		
		return (result > 0) ? true : false;
	}
	
	
	/**
	 * [멤버 검색 및 출력 메소드]
	 * searchMode에 따라 모두 출력하거나, ID,이름,주소가 keyWord와 일치하는 멤버를 출력해준다.
	 * @param searchMode 검색 모드
	 * @param keyWord 검색어
	 * @return 없음
	 */
	public void searchMember(int searchMode, String keyWord)
	{
		try
		{
			// ② 연결
			connection = DriverManager.getConnection(DatabaseConstant.URL, DatabaseConstant.USER, DatabaseConstant.PASSWORD);
			
			// ② 연결 [Statement]
			statement = connection.createStatement();
 
			// ③ 실행 [CRUD]
			
			switch( searchMode )
			{
				//아이디
				case SEARCH_ID:
					resultSet = statement.executeQuery("SELECT * FROM MEMBER WHERE ID LIKE '%" + keyWord + "%'");
				break;

				//이름
				case SEARCH_NAME:
					resultSet = statement.executeQuery("SELECT * FROM MEMBER WHERE NAME LIKE '%" + keyWord + "%'");
				break;
				
				
				//주소
				case SEARCH_ADDR:
					resultSet = statement.executeQuery("SELECT * FROM MEMBER WHERE ADDR LIKE '%" + keyWord + "%'");
				break;
				
				//이름, 주소, 아이디에서 검색
				case SEARCH_ALL:
					resultSet = statement.executeQuery("SELECT DISTINCT * FROM MEMBER WHERE ID LIKE '%" + keyWord + "%' OR NAME LIKE '%" + keyWord + "%' OR ADDR LIKE '%" + keyWord + "%'");
				break;
				
				//검색 안함
				case SEARCH_NONE:
					resultSet = statement.executeQuery("SELECT * FROM MEMBER");
					
					//기존 검색 상황도 초기화
					jTextField.setText(null);
					jButton.setText("검색");
					jComboBox.setSelectedIndex(0);
				break;
				
			}
			
			// 컬럼 정보 가져오기
			ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

			// 데이터를 담을 오브젝트 생성
			Object [] tempObject = new Object[resultSetMetaData.getColumnCount()];
			
			// DefaultTableModel 초기화
			defaultTableModel.setRowCount(0);
			
			while (resultSet.next())
			{
				for(int i=0; i < resultSetMetaData.getColumnCount(); i++)
				{
					tempObject[i] = resultSet.getString(i+1);
				}
				
				defaultTableModel.addRow(tempObject);
			}
			
			if( defaultTableModel.getRowCount() > 0 )
			{
				jTable.setRowSelectionInterval(0, 0); //첫째줄에 포커싱
			}
			
			
		}
		catch (SQLException e)
		{
			System.out.println("[연결 오류]\n" +  e.getStackTrace());
		}
		
		finally
		{
			closeDatabase();
		}
		
	}

	
	
	/**
	 * [멤버 추가 메소드]
	 * dialogMode가 NEW_MODE인지 EDIT_MODE인지를 체크한 후 ID, 이름, 나이, 주소값을 받아와서 새로 추가하거나 저장하는 메소드
	 * @param dialogMode NEW_MODE인지 EDIT_MODE인지를 체크하는 변수
	 * @param id 아이디
	 * @param name 이름
	 * @param age 나이
	 * @param addr 주소
	 * @return 정상적으로 수정되거나 추가되면 true, 실패하면 false를 반환한다.
	 */
	public boolean submitMember(int dialogMode, String id, String name, int age, String addr)
	{
		
		int result = 0;
		
		try
		{
			// ② 연결
			connection = DriverManager.getConnection(DatabaseConstant.URL, DatabaseConstant.USER, DatabaseConstant.PASSWORD);
 
			// ③ 실행 [CRUD]
			if(dialogMode == NEW_MODE)
			{
				preparedStatement = connection.prepareStatement("INSERT INTO MEMBER VALUES ( ?, ?, ?, ? )");
				preparedStatement.setString(1, id);
				preparedStatement.setString(2, name);
				preparedStatement.setInt(3, age);
				preparedStatement.setString(4, addr);
			}
			else
			{
				preparedStatement = connection.prepareStatement("UPDATE MEMBER SET NAME=?, AGE=?, ADDR=? WHERE ID=?");
				preparedStatement.setString(1, name);
				preparedStatement.setInt(2, age);
				preparedStatement.setString(3, addr);
				preparedStatement.setString(4, id);
			}
			
			
			// ③ 실행 [CRUD]
			result = preparedStatement.executeUpdate();
			 
		}
		catch (SQLException e)
		{
			System.out.println("[연결 오류]\n" +  e.getStackTrace());
		}
		
		finally
		{
			closeDatabase();
		}
		
		//내용 업데이트
		searchMember(SEARCH_NONE, null);
		
		return (result > 0) ? true : false;
	}

	
	
	// *** 멤버 삭제 메소드 ***
	/**
	 * [멤버 삭제 메소드]
	 * 멤버의 ID를 String으로 받아와서 삭제한다.
	 * @param id 아이디
	 * @return 멤버 삭제가 성공하면 true, 실패하면 false
	 */
	public boolean deleteMember(String id)
	{
		
		int result = 0;
		
		try
		{
			// ② 연결
			connection = DriverManager.getConnection(DatabaseConstant.URL, DatabaseConstant.USER, DatabaseConstant.PASSWORD);
 
			// ③ 실행 [CRUD]
			preparedStatement = connection.prepareStatement("DELETE FROM MEMBER WHERE ID=?");
			preparedStatement.setString(1, id);

			result = preparedStatement.executeUpdate();
			 
		}
		catch (SQLException e)
		{
			System.out.println("[연결 오류]\n" +  e.getStackTrace());
		}
		
		finally
		{
			closeDatabase();
		}
		
		return (result > 0) ? true : false;
	}	
	
	
	
	public static void main(String[] args)
	{
		//실행
		new MenuExam();

	}

	
	
	
	
	// *** 다이얼로그 클래스 ***
	/**
	 * 가입/수정 관련 이벤트를 포함해 JDialog를 생성하는 클래스 
	 * @author 안재하
	 */
	class MemberDialog
	{
		// *** 다이얼로그 UI 관련 변수 선언 ***
		
		JDialog jDialog = new JDialog(jFrame, "멤버 속성 입력");
		JButton idCheckButton = new JButton("ID 체크 확인");
		JButton submitButton = new JButton("가입");
		JButton cancelButton = new JButton("취소");
		
		JPanel fieldNamePanel = new JPanel(new GridLayout(4,1));
		JPanel fieldValuePanel = new JPanel(new GridLayout(4,1));
		JPanel buttonPanel = new JPanel(new FlowLayout());
		JPanel idPanel = new JPanel(new BorderLayout());
		
		JLabel idLabel = new JLabel("ID");
		JLabel nameLabel = new JLabel("이름");
		JLabel ageLabel = new JLabel("나이");
		JLabel addrLabel = new JLabel("주소");
		
		JTextField idField = new JTextField(10);
		JTextField nameField = new JTextField(10);
		JTextField ageField = new JTextField(10);
		JTextField addrField = new JTextField(10);
		
		
		// *** 다이얼로그 관련 변수 선언 ***
		
		int dialogMode = NEW_MODE;

		
		
		/**
		 * [MemberDialog 생성자]
		 * 파라메터가 아무것도 없는 경우, 가입 모드로 인식한다.
		 * 다이얼로그 관련 모든 설정을 다 하지만, modal 설정을 위해
		 * modal 설정과 visible은 호출한 곳에서 처리한다.
		 */
		MemberDialog()
		{
			// *** 다이얼로그 UI 설정 ***
			
			//패널에 콤포넌트 추가
			fieldNamePanel.add(idLabel);
			fieldNamePanel.add(nameLabel);
			fieldNamePanel.add(ageLabel);
			fieldNamePanel.add(addrLabel);

			idPanel.add(idField);
			idPanel.add(idCheckButton, "East");
			
			fieldValuePanel.add(idPanel);
			fieldValuePanel.add(nameField);
			fieldValuePanel.add(ageField);
			fieldValuePanel.add(addrField);
			
			buttonPanel.add(submitButton);
			buttonPanel.add(cancelButton);
			

			// 다이얼로그에 패널 추가
			jDialog.add(fieldNamePanel, "West");
			jDialog.add(fieldValuePanel, "Center");
			jDialog.add(buttonPanel, "South");


			// 다이얼로그의 크기와 보기 설정
			jDialog.setSize(350, 250);
			jDialog.setLocationRelativeTo(jFrame);
			jDialog.setResizable(false);
			jDialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			
			
			// *** 이벤트 설정 ***
			
			//ID 체크 메뉴
			idCheckButton.addActionListener(new ActionListener()
			{
				@Override
				public void actionPerformed(ActionEvent e)
				{
					//ID를 입력한 경우에만
					if(idField.getText().length() > 0)
					{
						//아이디가 존재하는 경우
						if(MenuExam.this.idCheck(idField.getText()))
						{
							JOptionPane.showMessageDialog(jDialog, "사용할 수 없는 아이디입니다!");
							
							idField.setText(null);
							idField.requestFocus();
						}
						//없는 아이디인 경우
						else
						{
							JOptionPane.showMessageDialog(jDialog, "사용 가능한 아이디입니다!");
						}
					}
					else
					{
						JOptionPane.showMessageDialog(jDialog, "아이디를 입력해주세요!");
						idField.requestFocus();
					}
				}			
			});
			
			
			//가입(수정) 메뉴
			submitButton.addActionListener(new ActionListener()
			{
				@Override
				public void actionPerformed(ActionEvent e)
				{
					//ID를 입력한 경우에만
					if(idField.getText().trim().length() == 0)
					{
						JOptionPane.showMessageDialog(jDialog, "아이디를 입력해주세요!");
						idField.requestFocus();
					}
					else if(idField.getText().trim().length() > 30)
					{
						JOptionPane.showMessageDialog(jDialog, "아이디는 30자 이내로 입력해야 합니다!");
						idField.requestFocus();
					}
					else if(dialogMode == NEW_MODE && MenuExam.this.idCheck(idField.getText()))
					{
						JOptionPane.showMessageDialog(jDialog, "사용할 수 없는 아이디입니다!");
						
						idField.setText(null);
						idField.requestFocus();
					}
					else if(nameField.getText().trim().length() == 0 )
					{
						JOptionPane.showMessageDialog(jDialog, "이름을 입력해주세요!");
						nameField.requestFocus();
					}
					else if(nameField.getText().trim().length() > 20)
					{
						JOptionPane.showMessageDialog(jDialog, "이름 20자 이내로 입력해야 합니다!");
						nameField.requestFocus();
					}
					else if(ageField.getText().trim().length() == 0 )
					{
						JOptionPane.showMessageDialog(jDialog, "나이를 입력해주세요!");
						ageField.requestFocus();
					}
					else if(!isNumber(ageField.getText().trim()))
					{
						JOptionPane.showMessageDialog(jDialog, "나이를 숫자로 입력해주세요!");
						
						ageField.setText(null);
						ageField.requestFocus();
					}
					else if(Integer.valueOf(ageField.getText()) < 0 || Integer.valueOf(ageField.getText()) > 999)
					{
						JOptionPane.showMessageDialog(jDialog, "나이는 0부터 999사이의 값만 입력가능합니다.!");
						ageField.requestFocus();
					}
					else if(addrField.getText().trim().length() == 0 )
					{
						JOptionPane.showMessageDialog(jDialog, "주소를 입력해주세요!");
						addrField.requestFocus();
					}
					else if(addrField.getText().trim().length() > 100 )
					{
						JOptionPane.showMessageDialog(jDialog, "주소는 100자 이내로 입력해야 합니다!");
						addrField.requestFocus();
					}
					
					//오류가 없는 경우
					else
					{
						if(MenuExam.this.submitMember(dialogMode, idField.getText().trim(), nameField.getText().trim(), Integer.valueOf(ageField.getText()), addrField.getText().trim()))
						{
							if(dialogMode == NEW_MODE)
							{
								JOptionPane.showMessageDialog(jDialog, "가입을 축하드립니다!");
							}
							else
							{
								JOptionPane.showMessageDialog(jDialog, "정상적으로 수정되었습니다!");
							}
							
							jDialog.dispose(); //닫기
						}
						//없는 아이디인 경우
						else
						{
							JOptionPane.showMessageDialog(jDialog, "입력 과정에서 오류가 발생했습니다!");							
						}

						
					}
				}			
			});
			

			//취소 메뉴
			cancelButton.addActionListener(new ActionListener()
			{
				@Override
				public void actionPerformed(ActionEvent e)
				{
					jDialog.dispose(); //닫기
				}			
			});
			
		}
		
		
		/**
		 * [MemberDialog 생성자]
		 * 파라메터가 있는 경우, 수정 모드로 인식한다.
		 * 파라메터가 없는 생성자를 호출해 해당 내용을 모두 실행하고
		 * 수정모드이므로 파라메터로 받아온 기존값을 필드에 출력해준다.
		 * 다이얼로그 관련 모든 설정을 다 하지만, modal 설정을 위해
		 * modal 설정과 visible은 호출한 곳에서 처리한다.
		 * @param id 아이디
		 * @param name 이름
		 * @param age 나이
		 * @param addr 주소
		 */
		MemberDialog(String id, String name, int age, String addr)
		{
			this();
			
			//모드 설정
			dialogMode = EDIT_MODE;
			
			//기존 값 설정
			idField.setText(id);
			nameField.setText(name);
			ageField.setText(String.valueOf(age));
			addrField.setText(addr);
			
			//ID 비활성화
			idField.setEnabled(false);
			idCheckButton.setEnabled(false);
			
			//버튼 수정
			submitButton.setText("수정");
		}
		
		
		
		/**
		 * [숫자인지 판별해주는 메소드]
		 * String값을 받아 Integer형으로 변환 테스트하여 오류 날 경우 false, 숫자일 경우 true를 리턴한다.
		 * @param s 임의의 문자열
		 * @return 숫자일경우 true, 아닐경우 false
		 */
		public boolean isNumber(String s)
		{
			
			try
			{
				//숫자로 바뀌는데 오류가 없으면 true
				Integer.valueOf(s);
				return true;
			}
			catch(NumberFormatException e)
			{
				//오류가 생기면 숫자가 아니므로 false
				return false;
			}
		}
	}
}












JAVA 관련 포스팅 더보기