이번 시간에는 자바 Frame을 활용하여 아이디와 패스워드를 입력한 후에 로그인 하여 메인 페이지로 이동하는 것을 구현할까 합니다.
먼저 로그인 화면을 구축하기 전에..
'퐁'씨라는 성을 가진 성만 입장이 허용되고, '콩' 씨라는 성은 절대 입장이 안된다는 예외 처리와, 기타 다른 성씨도 입장이 안된다는 예외 처리를 하는 클래스를 만들까 합니다.
자 소스코드 바로 보실까요~!
//사용자 정의 예외 클래스
class NotSupportedNameException extends Exception{
public NotSupportedNameException(){
super("지원되지 않는 이름입니다.");
}
//오버로드
public NotSupportedNameException(String msg){
super(msg);
}
}
public class PongSite {
public static void login(String name, String pwd) throws NotSupportedNameException{
System.out.println("***Login Page***");
char lastName=name.charAt(0); // 인수 name의 0번째, 즉 성을 체크
if(lastName=='퐁'){
System.out.println(name+"님 환영합니다.");
}else if(lastName=='콩'){
//사용자 정의 예외 발생
throw new NotSupportedNameException("콩씨는 절대로 입장 불가");
/* throw new 예외();
* throw와 throws는 세트로 함께 사용하자.
* */
}else{
//기타 성씨인 경우
throw new NotSupportedNameException("기타 성씨분들은 이용에 제한이 있어요");
// 문자 지우면 6번 super 메시지 출력
}
}
public static void main(String[] args) {
// 명령줄 인수로 이름, 비번을 받자
if(args.length!=2){
System.out.println("명령줄 인수 2개를 입력하세요[이름, 비밀번호]");
return;
}
String name=args[0]; String pwd=args[1];
try{
login(name,pwd); // PongSite의 login 함수로 입력 값 던져주기
}catch(NotSupportedNameException e){
String msg=e.getMessage(); // 예외 메시지를 문자열로 반환한다.
System.out.println(msg);
//스택기록을 출력하여 예외가 발생된 지점을 보여줌(디버깅용으로 사용)
e.printStackTrace();
return;
}
System.out.println(">>>사이트 이용<<<");
}
}
여기서 잠깐 결과 화면을 보여드리고 핵심 소스 코드를 보여드리겠습니다.
화면은 총 2개로 로그인 화면, 메인 화면으로 간단하게 구성했습니다.
저렇게 구현하기 위해 필요한 소스는 아래와 같습니다.
//사용자 정의 예외 클래스
public class MemberApp extends Frame implements ActionListener{
Panel loginP, mainP;
Panel p1,p2,p3;
CardLayout card;
Label lbName, lbPwd;
TextField tfName, tfPwd;
Button btLogin, btReset, btExit;
Button btBack, btExit2; // mainP에 붙이기
//btBack하면 loginP로 돌아가기
//btExit2=>종료
public MemberApp(){
super("::MemberApp::");
card = new CardLayout();
setLayout(card); // 카드레이아웃으로 설정
loginP = new Panel(); mainP = new Panel();
loginP.setBackground(new Color(102,111,123));
mainP.setBackground(Color.lightGray);
add(loginP,"loginP"); add(mainP,"mainP");
p1=new Panel(new BorderLayout());
loginP.add(p1);
p2=new Panel(new GridLayout(2,1,10,10)); // 라벨만 붙인다.
p3=new Panel(new GridLayout(2,1,10,10)); // 텍스트필드만 붙인다.
p1.add(p2, "West"); p1.add(p3, "Center");
p2.add(lbName=new Label("이 름:")); p2.add(lbPwd=new Label("비밀번호:"));
p3.add(tfName=new TextField(20)); p3.add(tfPwd=new TextField(20));
Panel p4=new Panel(); // 버튼 부착
p1.add(p4, "South");
p4.add(btLogin=new Button("Login"));
p4.add(btReset=new Button("Reset"));
p4.add(btExit=new Button("Exit"));
setBackground(new Color(102,111,123));
mainP.add(btBack=new Button("이전으로"));
mainP.add(btExit2=new Button("종 료"));
// 버튼 이벤트 리스너 등록
btLogin.addActionListener(this);
btReset.addActionListener(this);
btExit.addActionListener(this);
btBack.addActionListener(this);
btExit2.addActionListener(this);
}
@Override // 오버라이드는 부모가 exception을 하지 않았으면 throws를 하지 못한다.
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
if(o==btLogin){
loginCheck();
}else if(o==btReset){
tfName.setText(" ");
tfPwd.setText(" ");
tfName.requestFocus(); // 이름 텍스트 창에 포커스 맞추기
}else if(o==btExit||o==btExit2){
System.exit(0);
}else if(o==btBack){
JOptionPane.showMessageDialog(this, "로그인 페이지로 이동하겠습니다");
card.show(this, "loginP");
setBackground(new Color(102,111,123));
}
}
public void loginCheck(){
//1) tfName, tfPwd로부터 입력한 값 받아오기
String lastName=tfName.getText().trim();
String lastPwd=tfPwd.getText().trim();
//유효성 체크(빈문자열 체크) -> exception으로 처리하자(소스코드로 구현해도 되지만..)
//String 클래스 메소드
//- trim():문자열 앞 뒤에 있는 공백을 제거한다.
//char charAt(int index) : 특정 인덱스의 문자 1자를 반환한다.
//2) 퐁씨만 허용 PongSite.login(name, pwd)
try{
PongSite.login(lastName, lastPwd);
JOptionPane.showMessageDialog(btReset, "로그인을 환영합니다.");
card.show(this, "mainP");
setBackground(Color.lightGray);
}catch(NotSupportedNameException ee){
String message=ee.getMessage();
JOptionPane.showMessageDialog(this, message);
tfName.setText(""); tfPwd.setText(""); tfName.requestFocus();
return;
}catch(java.lang.StringIndexOutOfBoundsException ee){
String message="이름, 비번을 모두 입력하세요";
JOptionPane.showMessageDialog(this, message);
tfName.requestFocus();
return;
}
}
public Insets getInsets(){
return new Insets(70,10,10,20);
}
public static void main(String[] args) {
MemberApp my = new MemberApp();
my.setSize(400, 400); my.setVisible(true);
}
}
댓글 없음:
댓글 쓰기