Java

[Java] Paint Method

소댓 2023. 4. 6. 00:04

- 도형 그리기 / 글씨 쓰기 / 색 지정

 

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
package day24;
 
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class MyWin2 extends Frame{
    
    MyWin2() {
        
        // DefalutCloseOperation은 JFrame(자식)이라 Frame(부모)에서는 사용 불가 > 익명 inner class 활용
        addWindowListener(new WindowAdapter() {
            @Override  // WindowAdapter가 추상메서드이기 때문에 오버라이드 필요
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        
        
        setBounds(100100800600);
        setVisible(true);
        
    }
    
    @Override // 그림을 그리게 하는 paint라는 메서드 오버라이드
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g); // 기본 윈도우 창 그리기 (부모의 paint 메서드를 불러와라 > 부모가 기본 윈도우 창 그림)
        // Graphics g : 붓
        g.drawLine(100100200200); // (x1, y1) 좌표에서 (x1, y2) 좌표까지 직선 그리기
        
        // 사각형 그리기
        g.drawRect(300300100100); // x, y, 너비, 높이
        
        // 타원 그리기
        g.drawArc(1501501001000150);
        
        // 사각형 채우기
        g.fillRect(4004005050);
        
        // drawXXX() : 채우지 않고 그리기
        // fillXXXX() : 채우고 그리기
        
        g.setColor(Color.blue); // 파란색으로 지정
        
        g.drawString("홍길동"250100);
        
        Color c = new Color(5293132); // R, G, B
        
        g.setColor(c);
        
        g.drawString("스즈메의 문단속 문짝색"300200);
        
        
        Color c2 = new Color(23120741);
        
        g.setColor(c2);
        
        g.fillRect(200200150150);
        
        
        Color c3 = new Color(181215110);
        
        g.setColor(c3);
        
        g.drawRect(100100200200);
        
        
        
        Color c4 = new Color(186213230);
        
        g.setColor(c4);
        
        g.drawArc(300300500100600200);
        
    }
    
    public static void main(String[] args) {
        MyWin2 mw = new MyWin2();
    }
    
    
}
 
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
package day24;
 
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
 
public class MyWin3 extends Frame{
 
    MyWin3() {
        
        addWindowListener(new WindowAdapter() {
            @Override  
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        setBounds(100100800600);
        setVisible(true);
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        // 랜덤하게 직선 긋기
        
        Random rnd = new Random();
        
        for(int i=0; i<200; i++) { // 계속 반복하도록
            int x1 = rnd.nextInt(800);
            int y1 = rnd.nextInt(600);
            
            int x2 = rnd.nextInt(800);
            int y2 = rnd.nextInt(600);
            
//            g.drawLine(x1, y1, x2, y2); // 직선
            
            // 색상은 0~255 rgb값으로 구성
            int cr = rnd.nextInt(256);
            int cg = rnd.nextInt(256);
            int cb = rnd.nextInt(256);
            
            Color c = new Color(cr, cg, cb);
            
            g.setColor(c);
            
//            g.drawLine(x1, y1, x2, y2);
            g.drawOval(x1, y1, x2, y2); // 타원
            
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        MyWin3 mw = new MyWin3();
        
    }
}
 
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
package day25;
 
import java.awt.Button;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
import oracle.net.aso.g;
 
public class MyWin3 extends Frame implements ActionListener{
 
    Button btn;
    
    int x1 = 100// x, y는 전역변수로 선언(actionlistener에서도 사용하기 위해)
    int y1 = 100;
    int x2 = 200;
    int y2 = 200;
    
    MyWin3() {
    
        btn = new Button("Move");
        
        
        btn.addActionListener(this);
        
        add(btn, "South"); // 버튼 남쪽에 부착
        
        addWindowListener(new WindowAdapter() {
            @Override  
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        setBounds(100100800600);
        setVisible(true);
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        g.drawLine(x1, y1, x2, y2);
        System.out.println("paint method 호출 중");
    }
    
    @Override
    public void update(Graphics g) { // update method
        paint(g); // 선이 안지워지고 계속 그려지게
    }
    
    public static void main(String[] args) {
        MyWin3 mw = new MyWin3();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        
        System.out.println("버튼 눌림");
        
        x1 += 10;
        x2 += 10;
        repaint(); // update() 호출 : 지우기 + paint() 호출하기
        
    
    }
}
 
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
115
116
117
package day25;
 
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class MyWin4 extends Frame implements MouseListener{
// 마우스로 선 그려지게
 
    int x, y; // 윈도우창 위치 좌표 변수 : 화면 정중앙에 오게 할 전역변수
    
    int x1, y1; // 마우스 클릭한 좌표 변수 : 마우스 클릭을 기억하기 위한 전역변수
    int x2, y2; // 마우스 뗄 때 좌표 변수
    
    MyWin4() {
    
        Toolkit tool = Toolkit.getDefaultToolkit(); 
        
        Dimension d = tool.getScreenSize(); // 스크린의 사이즈를 객체로 받아옴
        
        // 현재 모니터의 너비와 높이
        double width = d.getWidth();
        double height = d.getHeight();
        
        System.out.println("width : "+width);
        System.out.println("height : "+height);
                
        
        // x좌표의 값은? (화면 정중앙에 오도록)
        x = (int)(width/2-800/2); // 계산하고, double을 int로 형변환
        // y좌표의 값은? (화면 정중앙에 오도록)
        y = (int)(height/2-600/2);
        
        
        addWindowListener(new WindowAdapter() {
            @Override  
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        
        // 마우스 이벤트
        addMouseListener(this);
        
        setBounds(x, y, 800600); // 화면 중앙에 오게
        setVisible(true);
    }
    
    @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.drawLine(x1, y1, x2, y2);
        
        }
    
    
    public static void main(String[] args) {
        MyWin4 mw = new MyWin4();
    }
 
    // 클릭 -> 드래그 -> 떼면 선 그려지게
    @Override
    public void mouseClicked(MouseEvent e) { // 클릭
        // TODO Auto-generated method stub
        
    }
 
 
    @Override
    public void mousePressed(MouseEvent e) { // 누르고 있을 때
        int x = e.getX(); // 이벤트가 일어난 x 좌표
        int y = e.getY();
        System.out.println("마우스 눌림 : ( "+x+" : "+y+" )");
        x1 = x; // 값을 누르고 나서도 기억하도록 전역변수에 담음
        y1 = y;
    }
 
    @Override
        public void update(Graphics g) {
//            super.update(g); // 다시 그려도 안사라지게    지우고 다시 그리는 것을 삭제하고,
            paint(g);         // paint(g); 추가
        }
    
 
    @Override
    public void mouseReleased(MouseEvent e) { // 눌렀다가 뗄 때
        int x = e.getX(); // 이벤트가 일어난 x 좌표
        int y = e.getY();
        System.out.println("마우스 뗄때 : ( "+x+" : "+y+" )");
        x2 = x; // 값을 누르고 나서도 기억하도록 전역변수에 담음
        y2 = y;
        repaint(); // 마우스 뗄 때 다시 그리게 > update, paint 호출
    }
 
 
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }
 
 
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }
 
    
}
 
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
package day25;
 
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class MyWin5 extends Frame implements MouseListener{
// 마우스로 선 그려지게
 
    int x, y; // 윈도우창 위치 좌표 변수 : 화면 정중앙에 오게 할 전역변수
    
    int x1, y1; // 마우스 클릭한 좌표 변수 : 마우스 클릭을 기억하기 위한 전역변수
    int x2, y2; // 마우스 뗄 때 좌표 변수
    
    MyWin5() {
    
        Toolkit tool = Toolkit.getDefaultToolkit(); 
        
        Dimension d = tool.getScreenSize(); // 스크린의 사이즈를 객체로 받아옴
        
        // 현재 모니터의 너비와 높이
        double width = d.getWidth();
        double height = d.getHeight();
        
        System.out.println("width : "+width);
        System.out.println("height : "+height);
                
        
        // x좌표의 값은? (화면 정중앙에 오도록)
        x = (int)(width/2-800/2); // 계산하고, double을 int로 형변환
        // y좌표의 값은? (화면 정중앙에 오도록)
        y = (int)(height/2-600/2);
        
        
        addWindowListener(new WindowAdapter() {
            @Override  
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        
        // 마우스 이벤트
        addMouseListener(this);
        
        setBounds(x, y, 800600); // 화면 중앙에 오게
        setVisible(true);
    }
    
    @Override
        public void paint(Graphics g) {
            super.paint(g);
//            g.drawLine(x1, y1, x2, y2);
            g.fillOval(x1, y1, 55);
        }
    
    
    public static void main(String[] args) {
        MyWin5 mw = new MyWin5();
    }
 
    // 클릭 -> 드래그 -> 떼면 선 그려지게
    @Override
    public void mouseClicked(MouseEvent e) { // 클릭
        // TODO Auto-generated method stub
        
    }
 
 
    @Override
    public void mousePressed(MouseEvent e) { // 누르고 있을 때
        int x = e.getX(); // 이벤트가 일어난 x 좌표
        int y = e.getY();
        System.out.println("마우스 눌림 : ( "+x+" : "+y+" )");
        x1 = x; // 값을 누르고 나서도 기억하도록 전역변수에 담음
        y1 = y;
        repaint(); // update, paint 호출
    }
 
    @Override
        public void update(Graphics g) {
//            super.update(g); // 다시 그려도 안사라지게    지우고 다시 그리는 것을 삭제하고,
            paint(g);         // paint(g); 추가
        }
    
 
    @Override
    public void mouseReleased(MouseEvent e) { // 눌렀다가 뗄 때
        
    }
 
 
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }
 
 
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }
 
    
}
 
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
package day25;
 
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
 
import javax.swing.JFrame;
 
public class MyWin6 extends JFrame{
 
    int x, y;
    Image img;
    Container panel; // 패널
    TCanvas can; // 그림 그리기 위한 캔버스 > 새 클래스 만들어야함!
    
    MyWin6() {
        
        // 화면 정중앙에 오도록
        Toolkit tool = Toolkit.getDefaultToolkit(); 
        Dimension d = tool.getScreenSize(); // 스크린의 사이즈를 객체로 받아옴
        
        img = tool.getImage("src/images/IU.png"); // 이미지 추가
        
        System.out.println("img : "+img);
        can = new TCanvas(img); // TCanvas에서 img 쓰기 위해 추가!
        
        // ContentPane : 패널 클래스, 패널과 container를 상속받은
        //               모든 컴포넌트를 삽입 가능
        panel = getContentPane(); // ContentPane의 참조값을 가져오기
        panel.add(can); // 패널에 can(TCanvas)를 추가 > 직접 붙이는 것이 아니라 contentpane에 붙여야 함!
        
        // 현재 모니터의 너비와 높이
        double width = d.getWidth();
        double height = d.getHeight();
        
        System.out.println("width : "+width);
        System.out.println("height : "+height);
                
        
        // x좌표의 값은? (화면 정중앙에 오도록)
        x = (int)(width/2-800/2); // 계산하고, double을 int로 형변환
        // y좌표의 값은? (화면 정중앙에 오도록)
        y = (int)(height/2-600/2);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(x, y, 800600);
        setVisible(true);
        
    }
    public static void main(String[] args) {
        
        MyWin6 mw = new MyWin6();
    }
}
 
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
package day25;
 
import java.awt.Graphics;
import java.awt.Image;
 
import javax.swing.JPanel;
 
// 그림이 그려져 있는 커스텀 패널
public class TCanvas extends JPanel{
// JPanel 상속 받았으니, 이 클래스도 패널!
    
    Image img; 
    
    // MyWin6의 img 가져오기 > 생성자 생성! 
    TCanvas(Image img) {
        this.img = img;
    }
    
    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 00this); // (이미지 이름, x좌표, y좌표, 현재 패널)
        }
    
}
 
cs

 

 

 

* Frame 클래스에서 윈도우 창 닫을 때
addWindowListener > add to snippet에 등록

addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

java - window close