Java

[Java] 로또 번호 추첨기 - 볼 이미지 부착 (ActionListener, ImageIcon, Random, Multi Thread 등 활용)

소댓 2023. 3. 28. 11:15

​1. 그림과 같이 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package day18quiz;
 
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
 
import day16quiz.Lotto;
 
public class Day18Q02 extends JFrame implements ActionListener {
    JButton[] jbtn;
    JButton jbtnStart;
    ImageIcon imgq;
    ImageIcon[] img; // 이미지 아이콘 배열
    
    Day18Q02(){
        setLayout(null); // 배치관리자 커스텀
        imgq = new ImageIcon("src/images/q2.jpg");
        img = new ImageIcon[45]; // 이미지 아이콘 배열
        jbtn = new JButton[6]; // 로또 숫자 버튼 6칸
        
        Font f = new Font("굴림체", Font.PLAIN, 30); // 폰트 수정
        
        // 이미지 객체 생성
        for(int i=0; i<jbtn.length; i++) {
            img[i] = new ImageIcon("src/images/ball"+(i+1)+".png"); // 이미지 경로 > 배치
        }
        
        // 버튼 객체 생성
        for(int i=0; i<jbtn.length; i++) {
            jbtn[i] = new JButton(); 
            jbtn[i].setBounds(100+(i*100), 10010080); // 컴포넌트 크기
            jbtn[i].setIcon(imgq); // 물음표 이미지(q) 부착
            jbtn[i].setFont(f); // 폰트 수정
            add(jbtn[i]);            // 부착
        }
        
        // 스타트 버튼
        jbtnStart = new JButton("인생은 한 방!");
        
        // 이벤트 처리 > implements ActionListener, 추상화 추가
        jbtnStart.addActionListener(this); 
        
        jbtnStart.setBounds(15035045040);
        add(jbtnStart);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(100100800600);
        setVisible(true);
    
    }
    
    public static void main(String[] args) {
        Day18Q02 d = new Day18Q02();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
//        System.out.println("버튼 눌림");
    
        Lotto lt = new Lotto();       // 로또 번호 담기
            // System.out.println(Arrays.toString(lt.num));
      for(int i=0; i<jbtn.length; i++) {
      jbtn[i].setLabel(""+lt.num[i]);
      }
      
//            btn1.setLabel(""+lt.num[0]); // ""+숫자 = 문자
//            btn2.setLabel(""+lt.num[1]);
//            btn3.setLabel(""+lt.num[2]);
//            btn4.setLabel(""+lt.num[3]);
//            btn5.setLabel(""+lt.num[4]);
//            btn6.setLabel(""+lt.num[5]);
        
    }
}
 
cs

2. 클릭하면 로또 번호에 해당하는 이미지로 출력

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package day18quiz;
 
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
 
import day16quiz.Lotto;
 
public class Day18Q03 extends JFrame implements ActionListener {
    JButton[] jbtn;
    JButton jbtnStart;
    ImageIcon imgq;
    ImageIcon[] img; // 이미지 아이콘 배열
    
    Day18Q03(){
        setLayout(null); // 배치관리자 커스텀
        imgq = new ImageIcon("src/images/q2.jpg");
        img = new ImageIcon[45]; // 이미지 아이콘 배열
        jbtn = new JButton[6]; // 로또 숫자 버튼 6칸
        
        Font f = new Font("굴림체", Font.PLAIN, 30); // 폰트 수정
        
        // 이미지 객체 생성
        for(int i=0; i<img.length; i++) {
            img[i] = new ImageIcon("src/images/ball"+(i+1)+".png"); // 이미지 경로 > 배치
        }
        
        // 버튼 객체 생성
        for(int i=0; i<jbtn.length; i++) {
            jbtn[i] = new JButton(); 
            jbtn[i].setBounds(100+(i*100), 10010080); // 컴포넌트 크기
            jbtn[i].setIcon(imgq); // 물음표 이미지(q) 부착
            jbtn[i].setFont(f); // 폰트 수정
            add(jbtn[i]);            // 부착
        }
        
        // 스타트 버튼
        jbtnStart = new JButton("인생은 한 방!");
        
        // 이벤트 처리 > implements ActionListener, 추상화 추가
        jbtnStart.addActionListener(this); 
        
        jbtnStart.setBounds(15035045040);
        add(jbtnStart);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(100100800600);
        setVisible(true);
    
    }
    
    public static void main(String[] args) {
        Day18Q03 d = new Day18Q03();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
//        System.out.println("버튼 눌림");
    
        Lotto lt = new Lotto();       // 로또 번호 담기
            // System.out.println(Arrays.toString(lt.num));
      for(int i=0; i<jbtn.length; i++) {
          
          jbtn[i].setIcon(img[lt.num[i]-1]); // 로또 이미지 부착
          System.out.print((lt.num[i]+"\t"));
      }
      System.out.println();
      
//            btn1.setLabel(""+lt.num[0]); // ""+숫자 = 문자
//            btn2.setLabel(""+lt.num[1]);
//            btn3.setLabel(""+lt.num[2]);
//            btn4.setLabel(""+lt.num[3]);
//            btn5.setLabel(""+lt.num[4]);
//            btn6.setLabel(""+lt.num[5]);
        
    }
}
 
cs

 

3. 버튼을 클릭하면 랜덤하게 이미지를 출력하다가 마지막에 최종적으로 로또번호 이미지가 출력

 

- Multi Thread를 위한 ball 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package day18quiz;
// 멀티스레드로 gui 버튼 처리
import java.util.Random;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
 
public class Ball extends Thread { // 멀티 스레드 : 스레드 상속
    
    JButton jbtn;
    ImageIcon[] img;
    int no; // 로또번호
    
    public Ball(JButton jbtn, ImageIcon[] img, int no) {
        // 멤버변수 초기화(전달 받아 참조)
        this.jbtn = jbtn;
        this.img = img;
        this.no = no;
    }
    
    @Override
    public void run() {
        // 랜덤하게 몇 개의 이미지를 출력
        Random rnd = new Random();
        for(int i=0; i<20; i++) {
        jbtn.setIcon(img[rnd.nextInt(45)]); // 랜덤하게 뽑은 이미지를 셋
        try {
            Thread.sleep(50); // 천천히 섞이도록.. > try, catch 삽입(예외 처리)
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
        // 최종 번호로 로또 번호를 지정
        jbtn.setIcon(img[no-1]);
 
    }
    
    
}
 
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package day18quiz;
 
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
 
import day16quiz.Lotto;
 
public class Day18Q04 extends JFrame implements ActionListener {
    JButton[] jbtn;
    JButton jbtnStart;
    ImageIcon imgq;
    ImageIcon[] img; // 이미지 아이콘 배열
    
    Day18Q04(){
        setLayout(null); // 배치관리자 커스텀
        imgq = new ImageIcon("src/images/q2.jpg");
        img = new ImageIcon[45]; // 이미지 아이콘 배열
        jbtn = new JButton[6]; // 로또 숫자 버튼 6칸
        
        Font f = new Font("굴림체", Font.PLAIN, 30); // 폰트 수정
        
        // 이미지 객체 생성
        for(int i=0; i<img.length; i++) {
            img[i] = new ImageIcon("src/images/ball"+(i+1)+".png"); // 이미지 경로 > 배치
        }
        
        // 버튼 객체 생성
        for(int i=0; i<jbtn.length; i++) {
            jbtn[i] = new JButton(); 
            jbtn[i].setBounds(100+(i*100), 10010080); // 컴포넌트 크기
            jbtn[i].setIcon(imgq); // 물음표 이미지(q) 부착
            jbtn[i].setFont(f); // 폰트 수정
            add(jbtn[i]);            // 부착
        }
        
        // 스타트 버튼
        jbtnStart = new JButton("인생은 한 방!");
        
        // 이벤트 처리 > implements ActionListener, 추상화 추가
        jbtnStart.addActionListener(this); 
        
        jbtnStart.setBounds(15035045040);
        add(jbtnStart);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(100100800600);
        setVisible(true);
    
    }
    
    public static void main(String[] args) {
        Day18Q04 d = new Day18Q04();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
//        System.out.println("버튼 눌림");
    
        Lotto lt = new Lotto();       // 로또 번호 담기
            // System.out.println(Arrays.toString(lt.num));
        // lt.num[0] ==> 30 이미지 배열 img[29]
        Ball b1 = new Ball(jbtn[0], img, lt.num[0]);
        Ball b2 = new Ball(jbtn[1], img, lt.num[1]);
        Ball b3 = new Ball(jbtn[2], img, lt.num[2]);
        Ball b4 = new Ball(jbtn[3], img, lt.num[3]);
        Ball b5 = new Ball(jbtn[4], img, lt.num[4]);
        Ball b6 = new Ball(jbtn[5], img, lt.num[5]);
        
        b1.start(); // 스레드 start
        b2.start();
        b3.start();
        b4.start();
        b5.start();
        b6.start();
        
        
        // 랜덤하게 몇 개의 이미지를 미리 보여주기 >> sleep 같이 쓰면 느려지니까 멀티 쓰레드로!
//        Random rnd = new Random();
//
//        for(int i=0; i<20; i++) { // 랜덤 지정을 20번 반복
//            for(int j=0; j<jbtn.length;j++) {
//                jbtn[j].setIcon(img[rnd.nextInt(45)]); // 랜덤하게 이미지 지정
//                try {
//                    Thread.sleep(50);
//                } catch (InterruptedException e1) {
//                    // TODO Auto-generated catch block
//                    e1.printStackTrace();
//                } // 조금 느리게 돌아가게.. sleep
//                // 오류 발생하니까 try, catch 넣어주기(예외 처리)
//            }
//        }
        
        
//      for(int i=0; i<jbtn.length; i++) {
//          jbtn[i].setIcon(img[lt.num[i]-1]); // 로또 이미지 부착
//          System.out.print((lt.num[i]+"\t"));
//      }
//      System.out.println();
      
//            btn1.setLabel(""+lt.num[0]); // ""+숫자 = 문자
//            btn2.setLabel(""+lt.num[1]);
//            btn3.setLabel(""+lt.num[2]);
//            btn4.setLabel(""+lt.num[3]);
//            btn5.setLabel(""+lt.num[4]);
//            btn6.setLabel(""+lt.num[5]);
        
    }
}
 
cs