본문 바로가기

   
Programming/Java

Java Swing 로그인 이후 새창 열기

반응형

Java Swing 로그인 이후 새창 열기

이전에 https://zzarungna.com/1275(로그인), https://zzarungna.com/1276(회원가입),https://zzarungna.com/1608(로그인, 회원가입 합체) 소스를 가져와 합치는 예제까지 작성한 적이 있습니다.

 

이전에 작성했던 내용 중 폴더나 파일이 없을 때 에러나지 않도록 폴더와 파일도 자동으로 만들어 지도록 소스 코드를 수정, 개선하였으며 로그인이 완료된 이후 새로운 창을 띄우는 내용도 추가하였습니다.

 

아이디 찾기와 비밀번호 찾기 기능은 아직 없으며 혹시라도 필요하신 분들이 있다면 나머지 기능이나 필요한 것들이 있다면 얘기해 주시면 기능을 추가하도록 하겠습니다. 소스 코드를 받아 실행 하시면 이전과 프로그램 기능은 같습니다.


 

폴더와(C 드라이브 java_member) 파일이(member.txt) 아예 없는 경우는 회원 가입으로 유도하도록 기능을 수정 하였습니다.


 

로그인 성공 시 기존 창은 보이지 않게 처리하고 새로운 판넬을 만들어 새로운 창이 나오도록 수정 하였습니다.


 

기존 창을 없애고 새로운 창을 띄우는 구문은 간단합니다. 폴더가 없을 때 폴더를 만들어 주고 로그인 진행 시 member.txt 파일이 없다면 만들어 주는 기능을 기존 소스에 추가하고 테스트하며 수정하는 과정은 폴더와 파일이 없을 때 테스트하며 작성하느라 시간이 조금 필요했습니다. 수정한 소스 파일과 소스 구문을 올려놓을 테니 필요하신 분들은 활용하시면 좋을 듯합니다.

Source.zip
0.00MB

SignUp.java

package test;

import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

import javax.swing.*;

public class SignUp extends JDialog{
	 private JPanel signUpPanel = new JPanel(new GridLayout(11, 0));
	 private JTextField idText = new JTextField("아이디");
	 private JPasswordField pwText = new JPasswordField();
	 private JPasswordField pwCheckText = new JPasswordField();
	 private JTextField nameText = new JTextField("이름");
	 private JTextField birthYearText = new JTextField("생일 년도");
	 private String[] birthMonthContent = {"생일 월","1","2","3","4","5","6","7","8","9","10","11","12"};	 
	 private JComboBox<String> birthMonthList = new JComboBox<>(birthMonthContent);	 	 
	 private JTextField birthDayText = new JTextField("생일 일자");
	 private JTextField phoneNumberText = new JTextField("핸드폰 번호");
	 private JButton signUpbtn = new JButton("회원가입");
	 private JLabel pwlabel = new JLabel("비밀번호");
	 private JLabel pwChecklabel = new JLabel("비밀번호 확인");
	  
	 private boolean membershipProgress = false;

	 public SignUp() {
		
		this.setTitle("회원가입");
		
		this.signUpPanel.add(idText);
		this.signUpPanel.add(pwlabel);
		this.signUpPanel.add(pwText);
		this.signUpPanel.add(pwChecklabel);
		this.signUpPanel.add(pwCheckText);
		this.signUpPanel.add(nameText);
		this.signUpPanel.add(birthYearText);
		this.signUpPanel.add(birthMonthList);
		this.signUpPanel.add(birthDayText);
		this.signUpPanel.add(phoneNumberText);
		this.signUpPanel.add(signUpbtn);
		
		this.setContentPane(signUpPanel);
		this.setSize(300,500);				
		this.setLocationRelativeTo(null);

		FocusEvent();
		checkValue();
	}
	 
	 //텍스트 필드에 있는 값을 체크하고 지우기 위한 메소드
	 private void FocusEvent() {
			idText.addFocusListener(new FocusListener() {
				public void focusLost(FocusEvent e) {				
					if(idText.getText().trim().length()==0) {
						idText.setText("아이디");
					}
				}
				public void focusGained(FocusEvent e) {				
					if(idText.getText().trim().equals("아이디")) {
						idText.setText("");
					}				
				}
			});
			
			nameText.addFocusListener(new FocusListener() {
				public void focusLost(FocusEvent e) {
					if(nameText.getText().trim().length()==0) {
						nameText.setText("이름");
					}
				}
				
				public void focusGained(FocusEvent e) {			
					if(nameText.getText().trim().equals("이름")) {
						nameText.setText("");
					}
				}
			});
			
			birthYearText.addFocusListener(new FocusListener() {
				public void focusLost(FocusEvent e) {
					if(birthYearText.getText().trim().length()==0) {
						birthYearText.setText("생일 년도");
					}
				}

				public void focusGained(FocusEvent e) {
					if(birthYearText.getText().trim().equals("생일 년도")) {
						birthYearText.setText("");
					}
				}
			});
			
			birthDayText.addFocusListener(new FocusListener() {
				public void focusLost(FocusEvent e) {
					if(birthDayText.getText().trim().length()==0) {
						birthDayText.setText("생일 일자");
					}
				}

				public void focusGained(FocusEvent e) {
					if(birthDayText.getText().trim().equals("생일 일자")) {
						birthDayText.setText("");
					}
				}
			});
			
			phoneNumberText.addFocusListener(new FocusListener() {
				public void focusLost(FocusEvent e) {
					if(phoneNumberText.getText().trim().length()==0) {
						phoneNumberText.setText("핸드폰 번호");
					}
				}

				public void focusGained(FocusEvent e) {
					if(phoneNumberText.getText().trim().equals("핸드폰 번호")) {
						phoneNumberText.setText("");
					}
				}
			});	
	 }
	 
	 //회원 가입할때 모든 값이 입력되었는지 체크하기 위한 메소드
	 private void checkValue(){
		 signUpbtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(idText.getText().trim().length()==0 || idText.getText().trim().equals("아이디")) {
					JOptionPane.showMessageDialog(null, "아이디를 입력해 주세요.", "아이디 입력", JOptionPane.WARNING_MESSAGE);
					idText.grabFocus();
					return;
				}
				
				if(pwText.getText().trim().length()==0) {
					JOptionPane.showMessageDialog(null, "비밀번호를 입력해 주세요.", "비밀번호 입력", JOptionPane.WARNING_MESSAGE);
					pwText.grabFocus();
					return;
				}
				
				if(pwCheckText.getText().trim().length()==0) {
					JOptionPane.showMessageDialog(null, "비밀번호 확인을 입력해 주세요.", "비밀번호 확인 입력", JOptionPane.WARNING_MESSAGE);
					pwCheckText.grabFocus();
					return;
				}
				
				if(!(pwText.getText().trim().equals(pwCheckText.getText().trim()))) {
					JOptionPane.showMessageDialog(null, "비밀번호가 같지 않습니다.!!", "비밀번호 확인", JOptionPane.WARNING_MESSAGE);
					return;
				}
				
				if(nameText.getText().trim().length()==0 || nameText.getText().trim().equals("이름")) {
					JOptionPane.showMessageDialog(null, "이름을 입력해 주세요.", "이름 입력", JOptionPane.WARNING_MESSAGE);
					nameText.grabFocus();
					return;
				}
				
				if(birthYearText.getText().trim().length()==0 || birthYearText.getText().trim().equals("생일 년도")) {
					JOptionPane.showMessageDialog(null, "생년월일의 생일 년도를 입력해 주세요.", "생일 년도 입력", JOptionPane.WARNING_MESSAGE);
					birthYearText.grabFocus();
					return;
				}
								
				if(birthMonthList.getSelectedIndex()==0) {
					JOptionPane.showMessageDialog(null, "생년월일의 월을 선택해 주세요.", "월 입력", JOptionPane.WARNING_MESSAGE);
					birthMonthList.grabFocus();
					return;
				}
				
				if(birthDayText.getText().trim().length()==0 || birthDayText.getText().trim().equals("생일 일자")) {
					JOptionPane.showMessageDialog(null, "생일 일자를 입력해 주세요.", "생일 일자 입력", JOptionPane.WARNING_MESSAGE);
					birthDayText.grabFocus();
					return;
				}
				
				if(phoneNumberText.getText().trim().length()==0 || phoneNumberText.getText().trim().equals("핸드폰 번호")) {
					JOptionPane.showMessageDialog(null, "핸드폰 번호를 입력해 주세요.", "핸드폰 번호 입력", JOptionPane.WARNING_MESSAGE);
					phoneNumberText.grabFocus();
					return;
				}				
				
				File file = new File("C:\\\\java_member\\member.txt");
				//회원 가입 시 파일이 없다면 파일을 하나 만들어 준다.
				if(file.exists()) {
					System.out.println("기존에 파일이 있어요.");					
				}else {
					System.out.println("파일이 없으니 파일을 하나 만듭니다.");
					try {
						file.createNewFile();
					}catch(Exception msg) {
						msg.printStackTrace();
					}
				}
				
				//파일이 없는 경우 파일을 만들어 주고 아이디와 비번을 저장하기 아이디|비밀번호 텍스트 파일에 차곡 차곡 저장하기~ | 는 아이디랑 패스워드 구분하기 위해 사용
				String txt = idText.getText()+"|"+pwText.getText();
				txt += "\n";//파일을 한라인씩 읽어야 해서 공백 찍기.
				writeTXT(txt);
				
				//여기까지 왔다면 모든 값을 입력하고 선택하는 것이 완료되었으니 회원가입 과정이 완료.				
				membershipProgress = true;				
				
				JOptionPane.showMessageDialog(null, "회원 가입이 완료 되었습니다.","회원 가입 완료.", JOptionPane.WARNING_MESSAGE);
								
				setVisible(false);
			}
		});
	 }
	 
	//파일에 문자 쓰기
	 public void writeTXT(String txt) {
			try{
				String fileName = "C:\\java_member\\member.txt" ;
				BufferedWriter fw = new BufferedWriter(new FileWriter(fileName, true));
				
				// 파일안에 문자열 쓰기
				fw.write(txt);
				fw.flush();

				// 객체 닫기
				fw.close();					
				
			}catch(Exception errmsg){
				errmsg.printStackTrace();
			}
	 }
	 
	 //메인 클래스에서 다이얼로그 회원가입 창 데이터를 가져오기 위한 get 메소드 선언
	public String getIdText() {
		return this.idText.getText().trim();
	}

	public String getPwText() {
		return this.pwText.getText().trim();
	}

	public String getPwCheckText() {
		return this.pwCheckText.getText().trim();
	}

	public String getNameText() {
		return this.nameText.getText().trim();
	}

	public String getBirthYearText() {
		return this.birthYearText.getText().trim();
	}

	public String getBirthMonthContent() {
		return this.birthMonthList.getSelectedItem().toString();
	}

	public String getBirthDayText() {
		return this.birthDayText.getText();
	}

	public String getPhoneNumberText() {
		return this.phoneNumberText.getText().trim();
	}

	public boolean memberCheck() {
		return membershipProgress;
	}
	 
	 
	 
}

 

SwingLogin.java

package test;
//패키지 하나 만드신거 추가 하시면 됩니다. 
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.*;

public class SwingLogin extends JFrame{
	private JPanel loginPanel = new JPanel(new GridLayout(4,4));
	private JLabel idLabel = new JLabel("아이디 "); 
	private JLabel pwLabel = new JLabel("비밀번호 ");
	private JTextField idText = new JTextField();
	private JPasswordField pwText = new JPasswordField();
	private JButton loginBtn = new JButton("로그인");
	private JButton idSearchBtn = new JButton("아이디 찾기");
	private JButton pwSearchBtn = new JButton("비밀번호 찾기");
	private JButton memberbtn = new JButton("회원가입");
	
	private JPanel loginOk = new JPanel();
	private JLabel welcome = new JLabel("로그인 성공~! 환영합니다. ");
	

	public SwingLogin() {
		super("로그인 창!");
		
		this.setContentPane(loginPanel);
		loginPanel.add(idLabel);
		loginPanel.add(pwLabel);
		loginPanel.add(idText);
		loginPanel.add(pwText);
		loginPanel.add(loginBtn);
		loginPanel.add(idSearchBtn);
		loginPanel.add(pwSearchBtn);		
		loginPanel.add(memberbtn);		
		
		//라벨 가운데 정렬
		idLabel.setHorizontalAlignment(NORMAL);
		pwLabel.setHorizontalAlignment(NORMAL);
		
		//현재 프레임 창 가운데 정렬 setSize를 먼저 해주어야 정상적으로 프레임이 가운데 정렬이 됨!
		setSize(350,150);
		this.setLocationRelativeTo(null);		
		
		this.setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		
		//로그인 버튼을 눌렀을때
		loginBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				String id = idText.getText().trim();
				String pw = pwText.getText().trim();
				String login = "";
				
				if(id.length()==0 || pw.length()==0) {
					JOptionPane.showMessageDialog(null, "아이디 또는 비밀번호를 입력 하셔야 됩니다.", "아이디나 비번을 입력!", JOptionPane.DEFAULT_OPTION);
					return;
				}
								
				//텍스트 파일에 저장된 모든 글자를 가져온다 | 구분자로 아이디와 비번이 맞는게 있다면 로그인 시켜주면 된다.
				try{
					File folder = new File("C:\\\\java_member");
					
					if(folder.isDirectory()) {
						System.out.println("이미 디렉토리가 있어요.");

						 File file = new File("C:\\\\java_member\\member.txt");
						 
						 if(file.exists()) {
							 BufferedReader reader = new BufferedReader(new FileReader(file));
								
						        String str;
						        ArrayList<String> txtmember = new ArrayList<>();
						        while ((str = reader.readLine()) != null) {
						        	txtmember.add(str);
						        }   
						       
						        reader.close();
						        
						        //memberlist에 아이디와 비밀번호 저장하기
						        HashMap<String,String> memberlist = new HashMap<>();
						        
						        for(int i=0; i<txtmember.size(); i++) {
						        	// | 구분자 기준으로 잘라난 텍스트를 memberlist에 넣어주기.
						        	String[] tempresult = txtmember.get(i).toString().split("\\|");
						        	memberlist.put(tempresult[0],tempresult[1]);
						        }
						        		        
						        //txt 파일에서 가져온 아이디 비번과 입력한 아이디 비번이 맞는지 확인
						        for ( String key : memberlist.keySet() ) {
						            if(id.equals(key.trim()) && pw.equals(memberlist.get(key))) {
						            	//로그인성공!
						            	login = "성공";
						            }
						        }
						 }else {
							 System.out.println("파일이 없다는건 회원 등록이 안되어 있다는 것. 회원가입 유도하기.");
							 JOptionPane.showMessageDialog(null, "회원만 사용 가능 합니다. 회원 가입을 진행해 주세요..", "회원 정보 없음.", JOptionPane.DEFAULT_OPTION);
						 }						 
					}else {
						System.out.println("디렉토리 없어서 만들어요~");
						folder.mkdir(); //폴더 생성합니다.
						System.out.println("폴더 생성 완료");
					}
				}catch(Exception errmsg){
					errmsg.printStackTrace();
				}
				
				if(login.equals("성공")) {
					JOptionPane.showMessageDialog(null, "로그인 성공", "로그인 확인!", JOptionPane.DEFAULT_OPTION);
					setVisible(false);//로그인 이후 로그인 창 없애기
					
					loginSuccess();//로그인 성공 화면 띄우기.
					return;
				}else {
					JOptionPane.showMessageDialog(null, "로그인 실패", "계정 정보를 확인해 주세요.", JOptionPane.DEFAULT_OPTION);	
				}
				
			}
		});
		
		//아이디 비밀번호 찾기 버튼을 눌렀을때
		idSearchBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "아이디 비번 찾기 기능~~", "아이디/비밀번호 찾기", JOptionPane.DEFAULT_OPTION);
			}
		});
		
		//회원가입 버튼을 눌렀을때
		memberbtn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				SignUp signup = new SignUp();
				signup.setVisible(true);
			}
		});
		
	}
	
	/* 로그인 성공 시 새창 띄우기 */
	public void loginSuccess() {
		this.setTitle("로그인 성공~!");
		this.setContentPane(loginOk);
		loginOk.add(welcome);
		
		setSize(350,150);
		this.setLocationRelativeTo(null);		
		
		this.setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
	}
	
	public static void main(String[] args) {
		new SwingLogin();		
	}
}

 

이리저리 소스를 갖다 붙이며 만드느라 쓸데없는 소스 정리는 나중에 시간을 내서 수정하면 좋을 것 같습니다. 회원가입 정보를 저장하는 폴더와 파일을 확인해서 만들어주고 로그인 완료 후 기존 창을 없애고 새로운 창이 나오는 기능이 필요했던 분들은 위 구문을 참고해서 활용하시면 좋을 것 같습니다. 다 작성하고 보니 텍스트 파일에 공백을 먼저 넣어줘서 문제가 있었군요. 이 부분도 수정해서 업로드하였습니다.

반응형