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(100, 100, 800, 600);
setVisible(true);
}
@Override // 그림을 그리게 하는 paint라는 메서드 오버라이드
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g); // 기본 윈도우 창 그리기 (부모의 paint 메서드를 불러와라 > 부모가 기본 윈도우 창 그림)
// Graphics g : 붓
g.drawLine(100, 100, 200, 200); // (x1, y1) 좌표에서 (x1, y2) 좌표까지 직선 그리기
// 사각형 그리기
g.drawRect(300, 300, 100, 100); // x, y, 너비, 높이
// 타원 그리기
g.drawArc(150, 150, 100, 100, 0, 150);
// 사각형 채우기
g.fillRect(400, 400, 50, 50);
// drawXXX() : 채우지 않고 그리기
// fillXXXX() : 채우고 그리기
g.setColor(Color.blue); // 파란색으로 지정
g.drawString("홍길동", 250, 100);
Color c = new Color(52, 93, 132); // R, G, B
g.setColor(c);
g.drawString("스즈메의 문단속 문짝색", 300, 200);
Color c2 = new Color(231, 207, 41);
g.setColor(c2);
g.fillRect(200, 200, 150, 150);
Color c3 = new Color(181, 215, 110);
g.setColor(c3);
g.drawRect(100, 100, 200, 200);
Color c4 = new Color(186, 213, 230);
g.setColor(c4);
g.drawArc(300, 300, 500, 100, 600, 200);
}
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(100, 100, 800, 600);
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(100, 100, 800, 600);
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, 800, 600); // 화면 중앙에 오게
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, 800, 600); // 화면 중앙에 오게
setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
// g.drawLine(x1, y1, x2, y2);
g.fillOval(x1, y1, 5, 5);
}
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, 800, 600);
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, 0, 0, this); // (이미지 이름, x좌표, y좌표, 현재 패널)
}
}
|
cs |
* Frame 클래스에서 윈도우 창 닫을 때 addWindowListener > add to snippet에 등록 addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) { System.exit(0); } }); java - window close |