티스토리 뷰
반응형
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 끝
}
}
}
반응형
'IT & programming > Java' 카테고리의 다른 글
| 8/23 - 채팅 소스, 서버 구축 (0) | 2012.08.23 |
|---|---|
| 8/22 - I/O, 스트림, IOEx 예제문제 (0) | 2012.08.22 |
| 8/20 - AWT, 로그인 창 예제 (0) | 2012.08.20 |
| 8/20 - AWT, 이벤트 처리방법, 예제 Frametest3 (0) | 2012.08.20 |
| 8/20 - Event의 종류와 관련 인터페이스 (0) | 2012.08.20 |
댓글