public abstract int insertAuto(MemberVO mvo, LottoVO lvo);
자동번호 생성-사용자 로또번호 생성하고 db(member_lotto)에 저장하고 저장결과 반환
public abstract int insertManual(MemberVO mvo, LottoVO lvo, Set< Integer > myLotto);
수동번호 저장-사용자가 체크한 숫자 로또 번호 db에 저장하고 저장결과 반환
public abstract ArrayList< MemberLottoVO > selectAllMemberLotto(int member_no);
사용자 전체 로또정보 조회-참여 회차, 참여번호, 타입, 당첨내역 전체 조회
public abstract MemberLottoVO selectMemberLotto(int member_no, int lotto_no);
사용자 로또정보 조회-사용자의 특정 회차 로또정보 조회
public abstract int updateResultNmoney(int lotto_no, int count, int money);
복권결과 및 포인트 저장-복권 결과와 당첨금액 정보 저장하고 결과반환
자동복권과 수동복권은 즉석복권이라는 이름에 맞게 1회 참여마다 당첨번호가 바뀌게 되어있다
당첨번호 생성 > 자동번호 생성 > 일치개수 비교
//당첨번호와 응모번호 중 동일한 번호가 있는지
for(int i=0;i<lvo.getLotto_number().length;i++) {
for(int j=0;j<mlvo.getLotto_number().length;j++) {
if(lvo.getLotto_number()[i]==mlvo.getLotto_number()[j]) {
count++;
}
}
}
lottoVO의 당첨번호와 memberlottoVO의 수동번호를 비교해서 동일한 숫자가 있으면 count 1씩 증가시킴.
if(count==6) else if(count==5)~~ else{꽝} 으로 당첨금과 일치개수 db 저장 및 ui에 표시
/*체크박스 생성*/
for(int i=0; i<chckbxArr.length;i++) {
chckbxArr[i]=new JCheckBox(String.valueOf(i+1));
add(chckbxArr[i]);
}
int y=60, x=20;
for(int i=0;i<chckbxArr.length;i++) {
chckbxArr[i].setBounds(x, y, 45, 23);
x+=50;
if((i+1)%9==0) {
x=20;
y+=30;
}
}
체크박스 for문으로 생성해주었음 좌표 계산은 프레임 크기에 따라 수식이 바뀔것같은데 대략 10~5단위로 간격조절해주었다
Set<Integer> myLotto=new TreeSet<Integer>();
for(int i=0;i<chckbxArr.length;i++) {
if(chckbxArr[i].isSelected()) {
int temp=Integer.parseInt(chckbxArr[i].getText());
myLotto.add(temp);
}
}
isSelected()
로 값을 가져왔는데 같은 체크박스를 여러번 클릭하면 클릭된 만큼 값이 입력되길래 중복을 방지하기 위해 set으로 데이터 선언.
//숫자가 6개 체크되지않고 버튼누르면 log 출력 및 종료
if(myLotto.size()!=6) {
txtAreaLog.setText(">>번호 6개를 골라주세요.");
myLotto.removeAll(myLotto); //set 초기화
for(int i=0;i<chckbxArr.length;i++) {
if(chckbxArr[i].isSelected()) {
chckbxArr[i].setSelected(false);
}
}
return;
}
6개보다 적거나 많은 체크박스가 선택되어 있을경우 모든 체크박스 해제하고 set에 저장된 값들도 지워줍니다.
복권결과 panel이 실행된 상태로 다시 참여하기 버튼을 누르면 내부적으로는 생성되지만 panel의 내용은 바뀌지 않더라고요
revalidate(), repaint()
을 잘 사용해주면 바뀔것같긴한데 아예 버튼을 클릭하지 못하게 하는게 더 깔끔해보여서 더이상 손대지않았습니당
private String[] header= {"회차","선택번호","복권유형","일치","당첨금"};
private Object[] records = new Object[header.length];
private DefaultTableModel model; //테이블 형태를 만들 변수
테이블 생성 시 사용할 변수
ArrayList<MemberLottoVO> list=mldao.selectAllMemberLotto(vo.getMember_no());
DecimalFormat df = new DecimalFormat("###,###"); // 당첨금에 , 찍기
StringBuffer buffer=new StringBuffer();
if(list.size()!=0) {
int count=list.get(0).getLotto_number().length;
for(int i=0;i<list.size();i++) {
buffer.setLength(0);
for(int j=0;j<count;j++) {
if(j==count-1) {
buffer.append(list.get(i).getLotto_number()[j]);
}else {
buffer.append(list.get(i).getLotto_number()[j]+", ");
}
}
records[0]=list.get(i).getLotto_no();//회차
records[1]=buffer.toString(); //선택번호
records[2]=list.get(i).getLotto_type(); //복권유형
records[3]=list.get(i).getCount(); //일치개수
records[4]=df.format(list.get(i).getMoney()); //당첨금
model.addRow(records);
}
}else {
return;
}
테이블 내용 추가
테이블 이용같은 경우 연락처 프로그램 만들때도 사용했기 때문에 응용했다! model을 이용해 한행씩 테이블에 입력해주기.
txtpw = new JPasswordField();
txtpw.setColumns(10);
txtpw.setEchoChar('*');
txtpw.setBounds(100, 121, 195, 30);
signupPanel.add(txtpw);
chckbxUpPw = new JCheckBox("비밀번호 보기");
chckbxUpPw.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(chckbxUpPw.isSelected()) {
txtpw.setEchoChar((char)0);
}else {
txtpw.setEchoChar('*');
}
}
});
chckbxUpPw.setBounds(100, 153, 115, 20);
signupPanel.add(chckbxUpPw);
passwordfield를 사용해서 비밀번호를 암호화해줌. setEchoChar()
로 가려지는 문자를 지정해주고 체크박스로 문자보기를 가능하게 해주었다.
passwordfield의 경우 String으로 text가 인식되는게 아니라 char타입으로 한글자씩 받아오기때문에 사용할땐 getText가 아니라 char[]에 getPassword()
해줘야합니다!
txtphone.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if (txtphone.getText().equals("예) 010-1234-5678")) {
txtphone.setText("");
txtphone.setForeground(Color.BLACK);
}
}
@Override
public void focusLost(FocusEvent e) {
if (txtphone.getText().isEmpty()) {
txtphone.setForeground(Color.GRAY);
txtphone.setText("예) 010-1234-5678");
}
}
});
focusGained
는 현재 컴포넌트가 포커즈를 얻었을 경우 실행되고 focusLost
는 현재 컴포넌트가 포커즈를 잃으면 실행되는 메소드.
포커즈를 얻은경우(해당 텍스트필드에 입력대기 상태) 표시되는 텍스트의 색상과 지정해둔 text를 지워주기.
이미지를 배경으로 깔고 버튼의 테두리를 없애 배경과 어울리게 버튼을 꾸며봄.
일반적인 버튼은 직사각형의 테두리를 가지고 있는데
btnManual.setBorderPainted(false);
btnManual.setContentAreaFilled(false);
버튼의 테두리와 여백을 지워주자 텍스트만 남게된다. 텍스트크기만큼만 인식하게 됨.
이렇게 10일간의 즉석복권 프로젝트가 끝났다! 앞으로 swing을 또 쓸일은 없겠지만 계획했던것만큼 결과물이 나와줘서 기쁘고 모듈적으로 완벽하진 않았기때문에 아쉬움도 남았다. 다음 프로젝트부턴 본격적으로 웹으로 진행할 예정...두근🙉 보다 더 발전한 프로젝트가 되길!
안녕하세요. 혹시 로또 프로젝트 소스를 좀 받을 수 있을지 궁금합니다!~