티스토리 뷰

반응형
AWT, 로그인 예제, Adapter클래스 이용

8/20일 예제 인용

 

 /*
  * 창닫기 기능 구현 : WindowAdapter(추상클래스) -> 구현
  * windowClosing(추상메소드)
  * 장점 : WindowListener를 이용할 경우는 실제로 필요하지 않은 메소드도 강제적으로 구현해야 하지만
  * 추상클래스(WindowAdapter)의 경우는 실제로 필요한 메소드만을 구현하면 되므로 경제적
  */

 

 

import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import com.kysoft.member.Member;
import com.kysoft.member.MemberDAO;

class JavaEx29 extends Frame { // Frame = 기본 Container 

	private static final long serialVersionUID = 1L;
	// Components
	Label lid; // ID 레이블
	Label lpwd; // PW 레이블
	TextField tfId; // ID 필드
	TextField tfPwd; // PW 필드
	Button ok; // 로그인 버튼
	
	Dialog msgDlg; // 팝업창
	Label msgLabel;

	// 초기화(Initialization)
	// components 인스턴스(객체) 생성 / 속성 할당 / container에 장착
	JavaEx29(String title) {
		super(title); // Frame(String title)을 호출한다.

		// Components 생성
		lid = new Label("ID :", Label.RIGHT); // Label의 text정렬을 오른쪽으로.
		lpwd = new Label("Password :", Label.RIGHT); // 약 12개의 글자를 입력할 수 있는 TextField 생성.
		tfId = new TextField(12);	
		tfPwd = new TextField(12);
		tfPwd.setEchoChar('*'); // 입력한 값 대신 '*'이 보이게 한다.
		
		tfId.setBackground(Color.yellow); // 배경색 지정
		tfPwd.setBackground(Color.yellow); // 배경색 지정
		
		ok = new Button("로그인"); //		ok = new Button("OK");
		
		msgDlg = new Dialog(this,"로그인 메시지",false);
		msgDlg.setSize(500,70);
		msgDlg.setLocation(50,50);
		msgDlg.setLayout(new FlowLayout());
		msgDlg.setVisible(false);
		
		msgLabel = new Label("");
		msgDlg.add(msgLabel);
		
		Button btnOk = new Button("OK");
		msgDlg.add(btnOk);

		btnOk.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				msgDlg.setVisible(false);
				msgDlg.dispose();
				tfId.setText("");
				tfPwd.setText("");
				tfId.requestFocus();
			}
		});
		
		// OK버튼과 TextField에 이벤트처리를 위한 Listener를 추가해준다.
		tfId.addActionListener(new EventHandler()); // ID field
		tfPwd.addActionListener(new EventHandler()); // PW field
		ok.addActionListener(new EventHandler()); // 로그인 버튼
		//super.addWindowListener(new EventHandler()); //
		//super.addWindowListener(new EventHandler()); //
		
	/*
	 * 창닫기 기능 구현 : WindowAdapter(추상클래스) -> 구현
	 * windowClosing(추상메소드)
	 * 장점 : WindowListener를 이용할 경우는 실제로 필요하지 않은 메소드도 강제적으로 구현해야 하지만
	 * 추상클래스(WindowAdapter)의 경우는 실제로 필요한 메소드만을 구현하면 되므로 경제적
	 */

		addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				e.getWindow().setVisible(false); // 창(윈도우 : Frme)을 닫다; 메모리상에서는 여전히
				e.getWindow().dispose(); // 메모리에서 제거
				System.exit(0); // 프로그램 정상 종료
		}
		});//
	
		
		//리스터(Listener Interface) -> 어댑터 클래스(Adapter class)
		
		//component들을 container에 장착(add)
		// 레이아웃(배치) 방식을 설정 
		setLayout(new FlowLayout()); // LayoutManager를 FlowLayout으로
		add(lid);	// ID Label // 생성한 Component들을 Frame에 포함시킨다.
		add(tfId); // ID field
		add(lpwd); // PW Label
		add(tfPwd); // PW field
		add(ok); // 로그인 버튼
		setSize(450, 70); // 크기설정
		setVisible(true); // Frame이 화면에 보이게 한다.
	}
	
	private boolean checkId(String id)  throws PatternSyntaxException {
		
		boolean flag = false;
		
		// 로그인 폼 점검(form validation) 시작
		/*
		 *  regex : ID : 1) 공백없음.  2) 8~12자   3) 특수문자(X)  
		 *                       4) 첫자는 반드시 영문자 소문자로 시작		                        
		 */
	     String pattern = "[a-z][a-z | A-Z | 0-9\\S]{7,11}"; 


					Pattern p = Pattern.compile(pattern);
					Matcher m = p.matcher(id);
					
					if (m.matches()) {
						flag=true;
					} else {
						//flag=false;
						msgLabel.setText("아이디는 공백없이 영문자나 숫자로 구성되며 8~12자 사이입니다.");
						msgDlg.setVisible(true);
					}
					return flag;
	}

	public static void main(String args[]) {
		JavaEx29 f = new JavaEx29("Login");
	}

	class EventHandler implements ActionListener { 
	
		public void actionPerformed(ActionEvent e){
			String id = tfId.getText();	 // tfId에 입력되어있는 text를 얻어온다.
			String password = tfPwd.getText();
		
			// DB P/G'n 시작
			HashMap<String, String> map = new HashMap<String, String>();

			MemberDAO dao = new MemberDAO();
			ArrayList<Member> members = new ArrayList<Member>();
		
			try {
						members = dao.getMembers();
						
			} catch (SQLException se) {
				System.out.println("예외처리 5: "+se.getMessage());
				se.printStackTrace();
			} catch (Exception ex) {
				System.out.println("예외처리 6: "+ex.getMessage());
				ex.printStackTrace();
			}
			
			for (int i=0; i<members.size();i++)
				map.put(members.get(i).getId(), members.get(i).getPw());	

			if (checkId(id)) { // ID 유효성(validation) 점검 = OK !

				if(!map.containsKey(id)) {
					msgLabel.setText("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
					msgDlg.setVisible(true);
					//System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");

				} else {
					if(!(map.get(id)).equals(password)) {
						msgLabel.setText("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
						msgDlg.setVisible(true);
						//System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
					} else {
						msgLabel.setText("id와 비밀번호가 일치합니다.");
						msgDlg.setVisible(true);
						//System.out.println("id와 비밀번호가 일치합니다.");						
					}//if
				}//if
			}
			// DB P/G'n 끝
		}
	}
	
}

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31