본문 바로가기
프로젝트/1. 세미_바나나톡

멀티 채팅 프로그램_2주차(01/02~01/08)

by 루팽 2023. 1. 8.

1) 1주 차 돌아보기 및 2주 차 진행상황

1주 차 때 선생님께 조언을 구한 스레드문제는 그냥 스레드를 하나씩 두고 기능 클래스를 나누는 것으로 결론이 나왔다.

그리고 클래스 설계는 솔직히 백 쪽은 아직 감이 안 잡혀서 일단 UI를 하나씩 맡아서 만들어놓고 조금 익숙해지면 그때 백과 프론트를 나눠서 다시 설계해보기로 했다.

그래서 2주 차엔 각자 파트를 나눠서 해당 부분 UI와 기능 구현에 집중하였다.

또 깃 협업을 사용하기로 했다. 잘못해서 날아가거나 터질까 봐 걱정이 많았는데 몇 번 테스트하며 쓰다 보니 편하고 좋아서 애용하고 있는 중이다.

 

2.1) 구현 시작 - 로그인창과 아이디, 비밀번호 찾기 창

나는 로그인, 아이디, 비밀번호 찾기 창을 맡았는데 기본 틀이 조금 있는 상태여서 조금은 수월하였다.

애를 먹은 부분이 있다면 Jtf위에 Jlb을 둬서 아이디, 비밀번호라는 글자가 나오게 하고 싶었는데, 집 컴퓨터에선 제대로 나오는데 학원컴퓨터에선 안 나와서 한참을 고생하다가 결국 없애고 Jtf에 직접 쓴 다음 포커스리스너를 이용해 입력창 부분을 클릭하면 글자색이 바뀌고 글자가 공백으로 바뀌는 것으로 변경했다.

Jlb문제는 참 이상했던 게 학원 컴퓨터에서 처음엔 안 보이지만 다른 화면을 갔다 오거나 최소화 한 다음 다시 창을 켜면 제대로 출력이 됐다. 그냥 버그였던 건가?

 

그다음 문제가 있었다면 세 개의 창을 로그인창의 Jft 하나만 쓰면서 화면전환을 하는 것이었다.

작업표시줄에 계속해서 창이 켜지고 꺼지고 하는 것이 마음에 안 들어서 그렇게 전환하는 방법을 선택한 것인데 문제는 전환은 잘 됐지만 회원가입이나 메인화면으로 이동하면 그전에 전환했던 만큼 창이 켜지는 것이었다.

코드를 쫓아가며 찾다보니 아이디, 비밀번호 찾기에서 로그인 창으로 돌아올 때 client.initDisplay()를 사용해서 그런 것이었다.

그래서 대신 client.setContentPane(client.jp_login)과 Client.revalidate()를 써서 화면전환을 하니 프레임도 하나만 뜨고 잘 작동이 됐다.

회원가입 쪽도 같은 프레임이면 좋을 것 같아 그쪽도 같은 방식으로 연결했다.

 

그리고 Jtf의 문자가 딱 붙어서 나오는 것이 마음에 안 들어서  jtf_userId.setBorder(new LineBorder(Color.white, 8))같이 테두리에 흰색으로 굵기를 줘서 적당한 위치에 문자가 입력될 수 있도록 했다.

 

간단한 안내창으로는 JOp을 사용했는데 UI와 이미지가 우리가 만드는 바나나톡과 어울리지 않기에 여러 가지로 구글링 하다가  UI를 바꿀 수 있는 방법을 알아내서 배경색, 글자색 등을 바꾸고 이미지도 이것저것 찾아서 추가해 줬다.

 

아직 모든 기능을 구현한 건 아니지만 기본적으로 Jtf 입력 조건이나 이벤트 처리 같은 건 해놨고 3주 차부터 스레드와 프로토콜을 이용한 서버연결 부분을 조금 시도해 봐야겠다.

 

중간중간 다른 팀원분들이 말한 것들도 테스트해주면서 문제점 잡는 것을 도와줬는데, 한번은 친구추가를 누를 때마다 리스트가 늘어나고 선택하면 null값이 뜨는 문제가 있다고 하기에 쉬는 시간마다 코드를 들여다보면서 하나씩 원인을 찾아봤는데, 결국엔 초기화와 순서의 문제였다.

친구추가 창이 뜰 때마다 원래 화면에 표시된 것들을 지운 후 해당 유저의 데이터로 초기화를 해서 그 데이터만 출력해줘야 하는데, 해당 코드를 넣지 않고 데이터만 삭제 후 추가하니 화면에는 전의 것과 지금 것이 전부 출력되는데 실제 값은 밑에 있는 지금 데이터들에만 들어있고 위에 부분은 전부 null값이었던 것이다.

 

아무튼 비록 시간은 걸릴지라도 문제를 하나씩 풀어가면서 조금씩 나아가고는 있다.

 

2.2) 프로토콜 수정

프로토콜은 1주 차에 팀원분이 대강 틀을 잡았는데 작업을 하다 보니 더 필요한 부분이 있어서 수정, 추가작업을 했다.

아마 만들어가면서 조금씩 변경될 것 같다.

 

3) 느낀 점

원래 프로젝트 시간을 토요일 저녁까지, 그리고 일요일 저녁부터 자기 전까지로 정했는데

토요일 10~12시 정도 회의를 한 후 그대로 12시까지 계속 코드 짜면서 프로젝트에 몰두해 버렸다.

평일에도 학원 갔다가 배운 것 정리하고 복습하고 프로젝트하다 보면 잘 시간이라 자유시간이 없어서 주말엔 적어도 10시간은 쉬자고 정했는데

토요일을 통으로 일해버려서 주말이 주말 같지 않았다.

그런데 어쩔 수 없는 것이 아직 해결되지 않은 문제가 있는데 그걸 구현하고 싶은 방향이 마음속에 있으니까 어떻게든 완성하고 싶어서 안달이 나게 된다.

문제점이 있을 때도 마찬가지로 이것저것 테스트해보고 싶어서 다른 게 눈에 안 들어온다.

그만큼 재미있고 잘 맞는 것 같지만 그래도 길게 이 일을 하려면 적당한 휴식시간과 체력관리가 필수적일 텐데 이렇게 시간관리를 못하면 어떡하나.

다음 주는 꼭 쉬는 시간을 충분히 확보해야겠다. 그리고 빨리 각자 구현한 것들을 이어보고 서버도 연결하고 싶다.

 

4) 3주 차에 해야 할 것

  1. 각자 기능 구현한 것 연결하고 테스트해 보기.
  2. 백과 프론트 역할로 돌아가서 기능 클래스 설계, 구현하기.
  3. DB연결 전 서버소켓 이용해서 테스트해 보기.

 

5) 2주 차 구현 코드

<바나나톡 프로젝트 깃허브 바로가기>

package banana_project.client.login;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import banana_project.client.join.MemJoin;
import banana_project.client.main.Main;
import banana_project.server.Protocol;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.regex.Pattern;

public class Client extends JFrame implements ActionListener, MouseListener, FocusListener {
  /**
   * 서버 연결부 선언
   */
  Socket socket = null;
  ObjectOutputStream oos = null;// 말하기
  ObjectInputStream ois = null;// 듣기
  String userId = null; // 유저입력 아이디
  String userPw = null; // 유저입력 비밀번호
  // 테스트용 아이디와 비밀번호
  String dbId = "banana@email.com";
  String dbPw = "1234";

  /**
   * 화면부 선언
   */
  JPanel jp_login = new JPanel(null);
  // 이미지
  String imgPath = "./app\\src\\main\\java\\banana_project\\image\\"; // 경로
  ImageIcon img_main = new ImageIcon(imgPath + "logo_main.png"); // 메인 로고 이미지
  ImageIcon img_title = new ImageIcon(imgPath + "logo_title.png"); // 타이틀창 이미지
  ImageIcon img_info = new ImageIcon(imgPath + "mini_info.png"); // JOp 인포 이미지
  ImageIcon img_notFound = new ImageIcon(imgPath + "mini_notFound.png"); // JOp 취소 이미지
  // 폰트
  Font p12 = new Font("맑은 고딕", Font.PLAIN, 12); // 보통12 폰트
  Font b12 = new Font("맑은 고딕", Font.BOLD, 12); // 볼드12 폰트
  Font b14 = new Font("맑은 고딕", Font.BOLD, 14); // 볼드14 폰트
  // Jtf
  JTextField jtf_userId = new JTextField(" example@email.com"); // 아이디 입력창
  JPasswordField jtf_userPw = new JPasswordField(" password"); // 비밀번호 입력창
  // Jbtn
  JButton jbtn_login = new JButton("로그인"); // 로그인 버튼
  JButton jbtn_join = new JButton("회원가입"); // 회원가입 버튼
  JButton jbtn_main = new JButton(img_main); // 메인 로고용 버튼
  // Jlb
  JLabel jlb_findId = new JLabel();
  JLabel jlb_findPw = new JLabel();

  /**
   * 화면부 메소드
   */
  public void initDisplay() {
    // 이벤트리스너
    jbtn_login.addActionListener(this);
    jbtn_join.addActionListener(this);
    jtf_userId.addActionListener(this);
    jtf_userPw.addActionListener(this);
    jtf_userId.addFocusListener(this);
    jtf_userPw.addFocusListener(this);
    jlb_findId.addMouseListener(this);
    jlb_findPw.addMouseListener(this);
    // 패널에 추가
    jp_login.add(jtf_userId);
    jp_login.add(jtf_userPw);
    jp_login.add(jbtn_login);
    jp_login.add(jbtn_join);
    jp_login.add(jlb_findId);
    jp_login.add(jlb_findPw);
    jp_login.add(jbtn_main);
    // Jtf 설정
    jtf_userId.setForeground(Color.gray);
    jtf_userPw.setForeground(Color.gray);
    jtf_userId.setBounds(60, 300, 270, 45);
    jtf_userPw.setBounds(60, 360, 270, 45);
    jtf_userId.setBorder(new LineBorder(Color.white, 8));
    jtf_userPw.setBorder(new LineBorder(Color.white, 8));
    // 로그인 버튼 설정
    jbtn_login.setBorderPainted(false);
    jbtn_login.setBackground(new Color(130, 65, 60));
    jbtn_login.setForeground(Color.white);
    jbtn_login.setFont(b14);
    jbtn_login.setBounds(200, 420, 130, 45);
    // 회원가입버튼 설정
    jbtn_join.setBorderPainted(false);
    jbtn_join.setBackground(new Color(130, 65, 60));
    jbtn_join.setForeground(Color.white);
    jbtn_join.setFont(b14);
    jbtn_join.setBounds(60, 420, 130, 45);
    // Jlb
    jlb_findId.setText("<HTML><U>아이디 찾기</U></HTML>");
    jlb_findPw.setText("<HTML><U>비밀번호 찾기</U></HTML>");
    jlb_findId.setForeground(new Color(135, 90, 75));
    jlb_findPw.setForeground(new Color(135, 90, 75));
    jlb_findId.setFont(p12);
    jlb_findPw.setFont(p12);
    jlb_findId.setBounds(100, 480, 70, 20);
    jlb_findPw.setBounds(220, 480, 80, 20);
    // 로고 이미지 설정
    jbtn_main.setBackground(new Color(255, 230, 120));
    jbtn_main.setBorderPainted(false); // 버튼 외곽선 없애기
    jbtn_main.setBounds(60, 35, 270, 250); // 바나나 이미지 고정
    // Jp 설정
    jp_login.setBackground(new Color(255, 230, 120));
    // JF 설정
    this.setTitle("바나나톡");
    this.setIconImage(img_title.getImage()); // 타이틀창 이미지
    this.setContentPane(jp_login); // 액자에 도화지 끼우기
    this.setSize(400, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null); // 창 가운데서 띄우기
    this.setResizable(false);
    this.setVisible(true);
    // JOp 설정
    UIManager UI = new UIManager();
    UI.put("OptionPane.background", new Color(255, 230, 120));
    UI.put("Panel.background", new Color(255, 230, 120));
    UI.put("OptionPane.messageFont", b12);
    UI.put("Button.background", new Color(130, 65, 60));
    UI.put("Button.foreground", Color.white);
    UI.put("Button.font", b12);
  }

  /**
   * 서버연결부 메소드
   */
  public void init() {
    try {
      socket = new Socket("127.0.0.1", 3000);
      oos = new ObjectOutputStream(socket.getOutputStream()); // 말하기
      ois = new ObjectInputStream(socket.getInputStream()); // 듣기
      ClientThread clientThread = new ClientThread(this); // 클라이언트 스레드와 연결
      clientThread.start(); // clientThread의 run() 호출
    } catch (Exception e) {
      System.out.println(e.toString());
    }
  }

  /**
   * ActionListener 메소드
   */
  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    // 로그인 버튼을 눌렀을 때
    if (obj == jbtn_login || obj == jtf_userId || obj == jtf_userPw) {
      userId = jtf_userId.getText();
      userPw = jtf_userPw.getText();
      String idCheck = "^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$"; // 이메일 형식
      // 아이디를 입력하지 않았을 경우
      if ("".equals(userId) || " example@email.com".equals(userId)) {
        JOptionPane.showMessageDialog(this, "이메일을 입력해주세요", "로그인", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 이메일 형식이 아닐 경우
      else if (!Pattern.matches(idCheck, userId)) {
        JOptionPane.showMessageDialog(this, "example@email.com 형식으로 입력해주세요", "로그인",
            JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 비밀번호를 입력하지 않았을 경우
      else if ("".equals(userPw) || " password".equals(userPw)) {
        JOptionPane.showMessageDialog(this, "비밀번호를 입력해주세요", "로그인", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 형식에 맞게 입력했을경우 DB에서 확인
      else {
        try {
          // 로그인 시도시 100#아이디#패스워드 형태로 서버에 전달
          oos.writeObject(Protocol.CLIENT_START
              + Protocol.seperator + userId
              + Protocol.seperator + userPw);
        } catch (Exception e2) {
          e2.printStackTrace();
        }
        // 테스트용 if문
        // 아이디, 비번이 맞을 경우
        if (userId.equals(dbId) && userPw.equals(dbPw)) {
          this.dispose();
          Main main = new Main();
          main.initDisplay();
        }
        // 아이디는 맞는데 비번을 틀릴 경우
        else if (userId.equals(dbId) && !userPw.equals(dbPw)) {
          JOptionPane.showMessageDialog(this, "비밀번호가 틀렸습니다..", "로그인", JOptionPane.ERROR_MESSAGE,
              img_notFound);
        }
        // 전부 틀릴 경우
        else {
          JOptionPane.showMessageDialog(this, "계정을 찾을 수 없습니다.", "로그인", JOptionPane.ERROR_MESSAGE,
              img_notFound);
        }
      }
    }
    // 회원가입 버튼을 눌렀을 때
    else if (obj == jbtn_join) {
      MemJoin memJoin = new MemJoin(this);
      memJoin.initDisplay();
    }
  }

  /**
   * MouseListener 메소드
   */
  @Override
  public void mouseClicked(MouseEvent e) {
  }

  @Override
  public void mousePressed(MouseEvent e) {
    Object obj = e.getSource();
    // 아이디찾기 라벨 눌렀을 때
    if (obj == jlb_findId) {
      IdFind idFind = new IdFind(this);
      idFind.initDisplay();
    }
    // 비밀번호찾기 라벨 눌렀을 때
    else if (obj == jlb_findPw) {
      PwFind pwfind = new PwFind(this);
      pwfind.initDisplay();
    }
  }

  @Override
  public void mouseReleased(MouseEvent e) {
  }

  @Override
  public void mouseEntered(MouseEvent e) {
  }

  @Override
  public void mouseExited(MouseEvent e) {
  }

  /**
   * FocusListener 메소드
   */
  @Override
  public void focusGained(FocusEvent e) {
    Object obj = e.getSource();
    // 아이디 jtf를 클릭했을 때
    if (obj == jtf_userId) {
      jtf_userId.setForeground(Color.black);
      if (" example@email.com".equals(jtf_userId.getText())) {
        jtf_userId.setText("");
      }
    }
    // 비밀번호 jtf를 클릭했을 때
    else if (obj == jtf_userPw) {
      jtf_userPw.setForeground(Color.black);
      if (" password".equals(jtf_userPw.getText())) {
        jtf_userPw.setText("");
      }
    }
  }

  @Override
  public void focusLost(FocusEvent e) {
    Object obj = e.getSource();
    // 아이디 jtf를 공백으로두고 벗어났을 때
    if (obj == jtf_userId) {
      if ("".equals(jtf_userId.getText())) {
        jtf_userId.setForeground(Color.gray);
        jtf_userId.setText(" example@email.com");
      }
    }
    // 비밀번호 jtf를 공백으로두고 벗어났을 때
    else if (obj == jtf_userPw) {
      if ("".equals(jtf_userPw.getText())) {
        jtf_userPw.setForeground(Color.gray);
        jtf_userPw.setText(" password");
      }
    }
  }

  /**
   * 메인메소드
   * 
   * @param args
   */
  public static void main(String[] args) {
    Client client = new Client();
    client.initDisplay();
    client.init();
  }
}

 

package banana_project.client.login;

import java.util.StringTokenizer;
import banana_project.server.Protocol;

public class ClientThread extends Thread {
  Client client = null;

  public ClientThread(Client client) {
    this.client = client;
  }

  @Override
  public void run() {
    boolean isStop = false;
    while (!isStop) {
      try {
        String msg = "";
        msg = (String) client.ois.readObject(); // 서버가 클라이언트에게 전송한 메시지
        StringTokenizer st = null;
        int protocol = 0;
        // 토큰 설정 및 전송받은 프로토콜
        if (msg != null) {
          st = new StringTokenizer(msg, "#");
          protocol = Integer.parseInt(st.nextToken());
        }
        // 프로토콜 switch문 시작
        switch (protocol) {
          // 로그인 성공
          case Protocol.LOGIN_S: {
            // main = new Main(client);
            // main.initDisplay();
          }
          // 아이디 틀림
          case Protocol.WRONG_ID: {
          }
          // 비밀번호 틀림
          case Protocol.WRONG_PW: {
          }
          default:
            System.out.println("해당하는 프로토콜이 존재하지 않습니다.");
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

 

package banana_project.client.login;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

public class IdFind implements ActionListener, FocusListener {
  /**
   * 서버 연결부 선언
   */
  Client client = null;
  String userName = null; // 유저입력 이름
  String userHp = null; // 유저입력 핸드폰번호
  // 테스트용 이름, 핸드폰번호, 아이디
  String dbName = "바나나";
  String dbHp = "01012341234";
  String dbId = "banana@email.com";

  /**
   * 화면부 선언
   */
  JPanel jp_idFind = new JPanel(null);
  // 이미지
  String imgPath = "./app\\src\\main\\java\\banana_project\\image\\";
  ImageIcon img_idFind = new ImageIcon(imgPath + "logo_find.png"); // 찾기 로고 이미지
  ImageIcon img_info = new ImageIcon(imgPath + "mini_info.png"); // JOp 인포 이미지
  ImageIcon img_confirm = new ImageIcon(imgPath + "mini_confirm.png"); // JOp 확인 이미지
  ImageIcon img_notFound = new ImageIcon(imgPath + "mini_notFound.png"); // JOp 취소 이미지
  // 폰트
  Font p12 = new Font("맑은 고딕", Font.PLAIN, 12); // 보통12 폰트
  Font b12 = new Font("맑은 고딕", Font.BOLD, 12); // 볼드12 폰트
  Font b14 = new Font("맑은 고딕", Font.BOLD, 14); // 볼드14 폰트
  // Jtf
  JTextField jtf_userName = new JTextField(" 이름"); // 이름 입력창
  JTextField jtf_userHp = new JTextField(" 핸드폰 번호 (-없이 숫자만 입력)"); // 전화번호 입력창
  // Jbtn
  JButton jbtn_back = new JButton("돌아가기"); // 돌아가기 버튼
  JButton jbtn_findId = new JButton("아이디 찾기"); // 아이디찾기 버튼
  JButton jbtn_main = new JButton(img_idFind); // 찾기 이미지용 버튼

  /**
   * 생성자
   * 
   * @param client
   */
  public IdFind(Client client) {
    this.client = client;
  }

  /**
   * 화면부 메소드
   */
  public void initDisplay() {
    // 이벤트리스너
    jtf_userHp.addFocusListener(this);
    jtf_userName.addFocusListener(this);
    jbtn_back.addActionListener(this);
    jbtn_findId.addActionListener(this);
    jtf_userHp.addActionListener(this);
    jtf_userName.addActionListener(this);
    // 패널에 추가
    jp_idFind.add(jtf_userName);
    jp_idFind.add(jtf_userHp);
    jp_idFind.add(jbtn_back);
    jp_idFind.add(jbtn_findId);
    jp_idFind.add(jbtn_main);
    // Jf 설정
    jtf_userName.setForeground(Color.gray);
    jtf_userHp.setForeground(Color.gray);
    jtf_userName.setFont(p12);
    jtf_userHp.setFont(p12);
    jtf_userName.setBounds(60, 300, 270, 45);
    jtf_userHp.setBounds(60, 360, 270, 45);
    jtf_userName.setBorder(new LineBorder(Color.white, 8));
    jtf_userHp.setBorder(new LineBorder(Color.white, 8));
    // 돌아가기 버튼 설정
    jbtn_back.setBorderPainted(false);
    jbtn_back.setBackground(new Color(130, 65, 60));
    jbtn_back.setForeground(Color.white);
    jbtn_back.setFont(b14);
    jbtn_back.setBounds(60, 420, 130, 45);
    // 아이디찾기 버튼 설정
    jbtn_findId.setBorderPainted(false);
    jbtn_findId.setBackground(new Color(130, 65, 60));
    jbtn_findId.setForeground(Color.white);
    jbtn_findId.setFont(b14);
    jbtn_findId.setBounds(200, 420, 130, 45);
    // 로고 이미지 설정
    jbtn_main.setBackground(new Color(255, 230, 120));
    jbtn_main.setBorderPainted(false); // 버튼 외곽선 없애기
    jbtn_main.setBounds(60, 35, 270, 250); // 바나나 이미지 고정
    // Jp 설정
    jp_idFind.setBackground(new Color(255, 230, 120)); // 패널색 노란색
    // JF설정
    client.setTitle("아이디 찾기");
    client.setContentPane(jp_idFind); // 액자에 도화지 끼우기
    client.setVisible(true);
    // JOp 설정
    UIManager UI = new UIManager();
    UI.put("OptionPane.background", new Color(255, 230, 120));
    UI.put("Panel.background", new Color(255, 230, 120));
    UI.put("OptionPane.messageFont", b12);
    UI.put("Button.background", new Color(130, 65, 60));
    UI.put("Button.foreground", Color.white);
    UI.put("Button.font", b12);
  }

  /**
   * ActionListener 메소드
   */
  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    // 돌아가기 버튼을 눌렀을 때
    if (obj == jbtn_back) {
      client.setContentPane(client.jp_login);
      client.revalidate();
    }
    // 아이디찾기 버튼을 눌렀을 때
    else if (obj == jbtn_findId || obj == jtf_userName || obj == jtf_userHp) {
      userName = jtf_userName.getText();
      userHp = jtf_userHp.getText();
      String hpCheck = userHp.replaceAll("[^0-9]", "-"); // 숫자가 아닌 문자들을 -로 치환
      // 이름을 입력하지 않았을 경우
      if (" 이름".equals(userName) || "".equals(userName)) {
        JOptionPane.showMessageDialog(client, "이름을 입력해주세요", "아이디 찾기", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 핸드폰번호를 입력하지 않았을 경우
      else if (" 핸드폰 번호 (-없이 숫자만 입력)".equals(userHp) || "".equals(userHp)) {
        JOptionPane.showMessageDialog(client, "핸드폰번호를 입력해주세요", "아이디 찾기", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 핸드폰번호에 숫자가 아닌 것을 넣었을 경우
      else if (hpCheck.contains("-")) {
        JOptionPane.showMessageDialog(client, "핸드폰번호는 -를 제외한 숫자만 입력해주세요.", "아이디 찾기", JOptionPane.WARNING_MESSAGE,
            img_info);
      } else {
        // 테스트용 if문
        // 이름, 전화번호가 맞을 경우
        if (userName.equals(dbName) && userHp.equals(dbHp)) {
          JOptionPane.showMessageDialog(client,
              dbName + "님의 아이디\n" + dbId, "아이디 찾기", JOptionPane.INFORMATION_MESSAGE, img_confirm);
        }
        // 틀릴 경우
        else {
          JOptionPane.showMessageDialog(client, "계정을 찾을 수 없습니다.", "아이디 찾기", JOptionPane.ERROR_MESSAGE,
              img_notFound);
        }
      }
    }
  }

  /**
   * FocusListener 메소드
   */
  @Override
  public void focusGained(FocusEvent e) {
    Object obj = e.getSource();
    // 이름 jtf를 클릭했을 때
    if (obj == jtf_userName) {
      jtf_userName.setForeground(Color.black);
      if (" 이름".equals(jtf_userName.getText())) {
        jtf_userName.setText("");
      }
    }
    // 핸드폰번호 jtf를 클릭했을 때
    else if (obj == jtf_userHp) {
      jtf_userHp.setForeground(Color.black);
      if (" 핸드폰 번호 (-없이 숫자만 입력)".equals(jtf_userHp.getText())) {
        jtf_userHp.setText("");
      }
    }
  }

  @Override
  public void focusLost(FocusEvent e) {
    Object obj = e.getSource();
    // 이름 jtf를 공백으로두고 벗어났을 때
    if (obj == jtf_userName) {
      if ("".equals(jtf_userName.getText())) {
        jtf_userName.setForeground(Color.gray);
        jtf_userName.setText(" 이름");
      }
    }
    // 핸드폰번호 jtf를 공백으로두고 벗어났을 때
    else if (obj == jtf_userHp) {
      if ("".equals(jtf_userHp.getText())) {
        jtf_userHp.setForeground(Color.gray);
        jtf_userHp.setText(" 핸드폰 번호 (-없이 숫자만 입력)");
      }
    }
  }

  /**
   * 테스트용메인
   * 
   * @param args
   */
  public static void main(String[] args) {
    Client c = new Client();
    c.initDisplay();
  }
}

 

package banana_project.client.login;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.regex.Pattern;

public class PwFind implements ActionListener, FocusListener {
  /**
   * 서버 연결부 선언
   */
  Client client = null;
  String userName = null; // 유저가 입력한 이름
  String userId = null; // 유저가 입력한 아이디
  String userHp = null; // 유저가 입력한 핸드폰번호
  // 테스트용 이름, 아이디, 핸드폰번호
  String dbName = "바나나";
  String dbId = "banana@email.com";
  String dbHp = "01012341234";

  /**
   * 화면부 선언
   */
  JPanel jp_pwFind = new JPanel(null);
  // 이미지 설정
  String imgPath = "./app\\src\\main\\java\\banana_project\\image\\";
  ImageIcon img_pwFind = new ImageIcon(imgPath + "logo_find.png"); // 찾기 로고 이미지
  ImageIcon img_info = new ImageIcon(imgPath + "mini_info.png"); // JOp 인포 이미지
  ImageIcon img_confirm = new ImageIcon(imgPath + "mini_confirm.png"); // JOp 확인 이미지
  ImageIcon img_notFound = new ImageIcon(imgPath + "mini_notFound.png"); // JOp 취소 이미지
  // 폰트
  Font p12 = new Font("맑은 고딕", Font.PLAIN, 12); // 보통12 폰트
  Font b12 = new Font("맑은 고딕", Font.BOLD, 12); // 볼드12 폰트
  Font b14 = new Font("맑은 고딕", Font.BOLD, 14); // 볼드14 폰트
  // jtf
  JTextField jtf_userName = new JTextField(" 이름");
  JTextField jtf_userId = new JTextField(" example@email.com");
  JTextField jtf_userHp = new JTextField(" 핸드폰 번호 (-없이 숫자만 입력)");
  // Jbtn
  JButton jbtn_back = new JButton("돌아가기"); // 돌아가기 버튼
  JButton jbtn_findPw = new JButton("비밀번호 찾기"); // 비밀번호찾기 버튼
  JButton jbtn_main = new JButton(img_pwFind); // 찾기 이미지용 버튼

  /**
   * 생성자
   * 
   * @param client
   */
  public PwFind(Client client) {
    this.client = client;
  }

  /**
   * 화면부 메소드
   */
  public void initDisplay() {
    // 이벤트리스너 연결
    jtf_userName.addFocusListener(this);
    jtf_userId.addFocusListener(this);
    jtf_userHp.addFocusListener(this);
    jbtn_back.addActionListener(this);
    jbtn_findPw.addActionListener(this);
    jtf_userName.addActionListener(this);
    jtf_userId.addActionListener(this);
    jtf_userHp.addActionListener(this);
    // 패널에 추가
    jp_pwFind.add(jtf_userName);
    jp_pwFind.add(jtf_userId);
    jp_pwFind.add(jtf_userHp);
    jp_pwFind.add(jbtn_back);
    jp_pwFind.add(jbtn_findPw);
    jp_pwFind.add(jbtn_main);
    // Jtf 설정
    jtf_userName.setForeground(Color.gray);
    jtf_userId.setForeground(Color.gray);
    jtf_userHp.setForeground(Color.gray);
    jtf_userName.setFont(p12);
    jtf_userId.setFont(p12);
    jtf_userHp.setFont(p12);
    jtf_userName.setBounds(60, 285, 270, 45);
    jtf_userId.setBounds(60, 345, 270, 45);
    jtf_userHp.setBounds(60, 405, 270, 45);
    jtf_userName.setBorder(new LineBorder(Color.white, 8));
    jtf_userId.setBorder(new LineBorder(Color.white, 8));
    jtf_userHp.setBorder(new LineBorder(Color.white, 8));
    // 돌아가기 버튼 설정
    jbtn_back.setBorderPainted(false);
    jbtn_back.setBackground(new Color(130, 65, 60));
    jbtn_back.setForeground(Color.white);
    jbtn_back.setFont(b14);
    jbtn_back.setBounds(60, 465, 130, 45);
    // 비밀번호찾기 버튼 설정
    jbtn_findPw.setBorderPainted(false);
    jbtn_findPw.setBackground(new Color(130, 65, 60));
    jbtn_findPw.setForeground(Color.white);
    jbtn_findPw.setFont(b14);
    jbtn_findPw.setBounds(200, 465, 130, 45);
    // 로고 이미지 설정
    jbtn_main.setBackground(new Color(255, 230, 120));
    jbtn_main.setBorderPainted(false); // 버튼 외곽선 없애기
    jbtn_main.setBounds(60, 20, 270, 250); // 바나나 이미지 고정
    // Jp 설정
    jp_pwFind.setBackground(new Color(255, 230, 120)); // 패널색 노란색
    // JF설정
    client.setTitle("비밀번호 찾기");
    client.setContentPane(jp_pwFind); // 액자에 도화지 끼우기
    client.setVisible(true);
    // JOp 설정
    UIManager UI = new UIManager();
    UI.put("OptionPane.background", new Color(255, 230, 120));
    UI.put("Panel.background", new Color(255, 230, 120));
    UI.put("OptionPane.messageFont", b12);
    UI.put("Button.background", new Color(130, 65, 60));
    UI.put("Button.foreground", Color.white);
    UI.put("Button.font", b12);
  }

  /**
   * ActionListener 메소드
   */
  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    // 돌아가기 버튼을 눌렀을 때
    if (obj == jbtn_back) {
      client.setContentPane(client.jp_login);
      client.revalidate();
    }
    // 비밀번호찾기 버튼을 눌렀을 때
    else if (obj == jbtn_findPw || obj == jtf_userName || obj == jtf_userId || obj == jtf_userHp) {
      userName = jtf_userName.getText();
      userId = jtf_userId.getText();
      userHp = jtf_userHp.getText();
      String idCheck = "^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$"; // 이메일 형식
      String hpCheck = userHp.replaceAll("[^0-9]", "-"); // 숫자가 아닌 문자들을 -로 치환
      // 이름을 입력하지 않았을 경우
      if (" 이름".equals(userName) || "".equals(userName)) {
        JOptionPane.showMessageDialog(client, "이름을 입력해주세요", "비밀번호 찾기", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 이메일을 입력하지 않았을 경우
      else if (" example@email.com".equals(userId) || "".equals(userId)) {
        JOptionPane.showMessageDialog(client, "이메일을 입력해주세요", "비밀번호 찾기", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 이메일 형식이 아닐 경우
      else if (!Pattern.matches(idCheck, userId)) {
        JOptionPane.showMessageDialog(client, "example@email.com 형식으로 입력해주세요", "비밀번호 찾기",
            JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 핸드폰번호를 입력하지 않았을 경우
      else if (" 핸드폰 번호 (-없이 숫자만 입력)".equals(userHp) || "".equals(userHp)) {
        JOptionPane.showMessageDialog(client, "핸드폰번호를 입력해주세요", "비밀번호 찾기", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 핸드폰번호에 숫자가 아닌 것을 넣었을 경우
      else if (hpCheck.contains("-")) {
        JOptionPane.showMessageDialog(client, "핸드폰번호는 -를 제외한 숫자만 입력해주세요.", "비밀번호 찾기", JOptionPane.WARNING_MESSAGE,
            img_info);
      } else {
        // 테스트용 if문
        // 이름, 아이디, 전화번호가 맞을 경우
        if (userName.equals(dbName) && userId.equals(dbId) && userHp.equals(dbHp)) {
          PwFindDialog pwFindDialog = new PwFindDialog(this);
          pwFindDialog.initDisplay();
        }
        // 틀릴 경우
        else {
          JOptionPane.showMessageDialog(client, "계정을 찾을 수 없습니다.", "비밀번호 찾기", JOptionPane.ERROR_MESSAGE,
              img_notFound);
        }
      }
    }
  }

  /**
   * FocusListener 메소드
   */
  @Override
  public void focusGained(FocusEvent e) {
    Object obj = e.getSource();
    // 이름 jtf를 클릭했을 때
    if (obj == jtf_userName) {
      jtf_userName.setForeground(Color.black);
      if (" 이름".equals(jtf_userName.getText())) {
        jtf_userName.setText("");
      }
    }
    // 아이디 jtf를 클릭했을 때
    else if (obj == jtf_userId) {
      jtf_userId.setForeground(Color.black);
      if (" example@email.com".equals(jtf_userId.getText())) {
        jtf_userId.setText("");
      }
    }
    // 핸드폰번호 jtf를 클릭했을 때
    else if (obj == jtf_userHp) {
      jtf_userHp.setForeground(Color.black);
      if (" 핸드폰 번호 (-없이 숫자만 입력)".equals(jtf_userHp.getText())) {
        jtf_userHp.setText("");
      }
    }
  }

  @Override
  public void focusLost(FocusEvent e) {
    Object obj = e.getSource();
    // 이름 jtf를 공백으로두고 벗어났을 때
    if (obj == jtf_userName) {
      if ("".equals(jtf_userName.getText())) {
        jtf_userName.setForeground(Color.gray);
        jtf_userName.setText(" 이름");
      }
    }
    // 아이디 jtf를 공백으로두고 벗어났을 때
    else if (obj == jtf_userId) {
      if ("".equals(jtf_userId.getText())) {
        jtf_userId.setForeground(Color.gray);
        jtf_userId.setText(" example@email.com");
      }
    }
    // 핸드폰번호 jtf를 공백으로두고 벗어났을 때
    else if (obj == jtf_userHp) {
      if ("".equals(jtf_userHp.getText())) {
        jtf_userHp.setForeground(Color.gray);
        jtf_userHp.setText(" 핸드폰 번호 (-없이 숫자만 입력)");
      }
    }
  }

  /**
   * 테스트용메인
   * 
   * @param args
   */
  public static void main(String[] args) {
    Client c = new Client();
    c.initDisplay();
  }
}

 

package banana_project.client.login;

import java.awt.Color;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class PwFindDialog extends JDialog implements ActionListener {
  /**
   * 서버연결부 선언
   */
  PwFind pwFind = null;
  String newPw = null; // 유저가 재설정한 비밀번호

  /**
   * 화면부 선언
   */
  JPanel jp_pwReset = new JPanel(null);
  // 이미지
  String imgPath = "./app\\src\\main\\java\\banana_project\\image\\";
  ImageIcon img_title = new ImageIcon(imgPath + "logo_title.png"); // 타이틀창 이미지
  ImageIcon img_info = new ImageIcon(imgPath + "mini_info.png"); // JOp 인포 이미지
  ImageIcon img_confirm = new ImageIcon(imgPath + "mini_confirm.png"); // JOp 확인 이미지
  ImageIcon img_notFound = new ImageIcon(imgPath + "mini_notFound.png"); // JOp 취소 이미지
  // 폰트
  Font p12 = new Font("맑은 고딕", Font.PLAIN, 12); // 보통12 폰트
  Font b12 = new Font("맑은 고딕", Font.BOLD, 12); // 볼드12 폰트
  Font b14 = new Font("맑은 고딕", Font.BOLD, 14); // 볼드14 폰트
  // Jtf
  JPasswordField jtf_pwFirst = new JPasswordField();
  JPasswordField jtf_pwSecond = new JPasswordField();
  // Jbtn
  JButton jbtn_pwReset = new JButton("비밀번호 재설정");
  // Jlb
  JLabel jlb_pwFirst = new JLabel("새로운 비밀번호");
  JLabel jlb_pwSecond = new JLabel("새로운 비밀번호 확인");

  /**
   * 생성자
   * 
   * @param pwFind
   */
  public PwFindDialog(PwFind pwFind) {
    this.pwFind = pwFind;
  }

  /**
   * 화면부 메소드
   */
  public void initDisplay() {
    // 이벤트리스너 연결
    jtf_pwFirst.addActionListener(this);
    jtf_pwSecond.addActionListener(this);
    jbtn_pwReset.addActionListener(this);
    // 패널에 추가
    jp_pwReset.add(jlb_pwFirst);
    jp_pwReset.add(jlb_pwSecond);
    jp_pwReset.add(jtf_pwFirst);
    jp_pwReset.add(jtf_pwSecond);
    jp_pwReset.add(jbtn_pwReset);
    // Jtf 설정
    jtf_pwFirst.setBounds(75, 90, 250, 45);
    jtf_pwSecond.setBounds(75, 190, 250, 45);
    jtf_pwFirst.setBorder(new LineBorder(Color.white, 8));
    jtf_pwSecond.setBorder(new LineBorder(Color.white, 8));
    // 비밀번호 재설정 버튼
    jbtn_pwReset.setBorderPainted(false);
    jbtn_pwReset.setBackground(new Color(130, 65, 60));
    jbtn_pwReset.setForeground(Color.white);
    jbtn_pwReset.setFont(b14);
    jbtn_pwReset.setBounds(110, 265, 180, 45);
    // Jlb 설정
    jlb_pwFirst.setForeground(new Color(135, 90, 75));
    jlb_pwSecond.setForeground(new Color(135, 90, 75));
    jlb_pwFirst.setFont(b12);
    jlb_pwSecond.setFont(b12);
    jlb_pwFirst.setBounds(75, 50, 90, 45);
    jlb_pwSecond.setBounds(75, 150, 120, 45);
    // Jp 설정
    jp_pwReset.setBackground(new Color(255, 230, 120));
    // JDg 설정
    this.setTitle("비밀번호 재설정");
    this.setIconImage(img_title.getImage()); // 타이틀창 이미지
    this.setContentPane(jp_pwReset);
    this.setSize(400, 400);
    this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    this.setLocationRelativeTo(pwFind.client);
    this.setResizable(false);
    this.setVisible(true);
    // JOp 설정
    UIManager UI = new UIManager();
    UI.put("OptionPane.background", new Color(255, 230, 120));
    UI.put("Panel.background", new Color(255, 230, 120));
    UI.put("OptionPane.messageFont", b12);
    UI.put("Button.background", new Color(130, 65, 60));
    UI.put("Button.foreground", Color.white);
    UI.put("Button.font", b12);
  }

  /**
   * ActionListener 메소드
   */
  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    // 비밀번호 재설정 버튼을 눌렀을 때
    if (obj == jbtn_pwReset || obj == jtf_pwFirst || obj == jtf_pwSecond) {
      newPw = jtf_pwFirst.getText();
      String rePw = jtf_pwSecond.getText();
      // 비밀번호를 입력하지 않았을 경우
      if ("".equals(newPw) || "".equals(rePw)) {
        JOptionPane.showMessageDialog(this, "비밀번호를 입력해주세요", "비밀번호 재설정", JOptionPane.WARNING_MESSAGE, img_info);
      }
      // 비밀번호1,2가 틀릴 경우
      else if (!newPw.equals(rePw)) {
        JOptionPane.showMessageDialog(this, "비밀번호가 일치하지 않습니다.", "비밀번호 재설정", JOptionPane.WARNING_MESSAGE, img_notFound);
      }
      // 올바르게 입력하면 DB전송
      else {
        JOptionPane.showMessageDialog(this, "비밀번호가 재설정되었습니다.", "비밀번호 재설정", JOptionPane.WARNING_MESSAGE, img_confirm);
        this.dispose();
        pwFind.client.setContentPane(pwFind.client.jp_login);
        pwFind.client.revalidate();
        try {
          // 비밀번호 재설정시 서버에 전달
        } catch (Exception e2) {
          e2.printStackTrace();
        }
      }
    }
  }

  /**
   * 테스트용 메인
   * 
   * @param args
   */
  public static void main(String[] args) {
    Client c = new Client();
    PwFind p = new PwFind(c);
    PwFindDialog pd = new PwFindDialog(p);
    pd.initDisplay();
  }
}

댓글