1. 그리는 위치
- JPanel : 그림 그릴 수 있는 화면 갖고 있고, 동시에 컨테이너 역할도 함
class MyPanel extends JPanel {
...
}
public class MyFrame extends JFrame {
public MyFrame() {
MyPanel panel = new MyPanel();
add(panel);
}
}
2. paintComponent()
- 컴포넌트가 가지고 있는 메소드
- 모든 컴포넌트가 가지고 있으며, 이 메소드를 재정의함으로써 그림을 그림
- 컴포넌트를 다시 그릴 필요가 있을 때마다 자바 시스템에 의해 호출됨 (ex. 프레임이 가려졌다가 다시 나타나는 경우)
- super.paintComponent(g) 호출
- 전체 구성요소를 전부 그리는 것이 아닌 경우 호출
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 그림그리는 코드
}
}
3. repaint()
- 사용자가 직접 paintComponent()를 호출할 수 없음. 반드시 자동으로 호출되어야 함
- 사용자가 화면을 다시 그리고 싶은 경우 repaint() 호출
-> repaint()가 적절한 시기에 paintComponent() 호출
4. 색상 변경
Color c = Color.BLUE;
Color c = new Color(255, 0, 255);
- setBackground(c) : 컴포넌트 객체 배경색 설정
- setColor(c) : 전경색 설정
- Color getColor() : 현재 전경색 반환
5. 폰트 객체 생성
- Font(폰트 이름(Alias, Serif, Gothic ...) , 스타일(Font.PLAIN, BOLD, ITALIC ...), 크기(10, 30, ...))
Font font = new Font("Courier", Font.PLAIN, 10);
public void paint(Graphics g) {
g.setFont(font);
...
}
JLabel lbl = new JLabel("Hello");
lbl.setFont(new Font("Gothic", Font.BOLD, 30));
6. Graphics 클래스
- 텍스트 문자열 : drawString();
g.drawString("Hello World!", x, y); // x, y : 위치 설정
- 기초 도형들
- draw---(); : 선으로 그리기
- fill---(); : 채워서 그리기
drawLine(int x1, int y1, int x2, int y2); // (x1, y1)에서 (x2, y2)까지 직선
drawRect(int x, int y, int width, int height); // (x, y)에서 폭 width, 높이 height인 직사각형
drawOval(int x, int y, int width, int height);
// (x, y)에서 폭 width, 높이 height인 직사각형에 내접하는 타원
drawArc(int x, int y, int width, int height, int startAngle, int arcAngle);
// 좌측 상단 좌표가 (x, y)이며 폭 width, 높이 height인 사각형에 내접하는 타원에서
// startAngle을 시작 각도로 하여 arcAngle의 각도만큼 호를 그림
drawPolygon(int[] x, int y[], length); // 배열 x[], y[]를 갖고 여러 개의 직선 (전부 이음)
drawPolyline(int[] x, int y[], length); // 배열 x[], y[]를 갖고 여러 개의 직선 (처음과 끝 잇지 않음)
- 이미지 : drawImage();
ImageIcon icon = new ImageIcon("car.png");
img = icon.getImage();
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, x, y, null);
}
7. 그래픽 좌표계
8. 예제1) 화면 클릭하면 그 위치에 사각형 그리도록
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MyFrame extends JFrame {
int x, y;
class MyPanel extends JPanel {
public MyPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
repaint();
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.ORANGE);
g.fillRect(x, y, 100, 100);
}
}
public MyFrame() {
setSize(600, 200);
add(new MyPanel());
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new MyFrame();
}
}
발전 버전) 드래그 한 크기의 사각형 그리고 패널 위에 저장하기
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Rect {
int x, y, w, h;
public Rect(int x, int y, int w, int h) {
this.x = x; this.y = y; this.w = w; this.h = h;
}
}
public class GraphicTest extends JFrame {
int x, y;
int w = 100, h = 100;
int x1, y1, x2, y2;
Vector<Rect> list = new Vector<>();
class MyPanel extends JPanel {
public MyPanel() {
addMouseListener(new mouseAdapter() {
public void mousePressed(MouseEvent e) { // 눌렀을 때 위치
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) { // 뗄 때 위치
x2 = e.getX();
y2 = e.getY();
x = Math.min(x1, x2);
y = Math.min(y1, y2); // 사각형 시작점
w = Math.abs(x1-x2);
h = Math.abs(y1-y2);
list.add(new Rect(x, y, w, h)); // 사각형 객체 모음
repaint();
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.orange);
g.fillRect(x, y, w, h); // 드래그하는 동안 그려지는 사각형
for(Rect r : list)
g.drawRect(r.x, r.y, r.w, r.h);
}
}
public GraphicTest() {
add(new MyPanel());
setSize(600, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new GraphicTest();
}
}
9. 예제2) 바운싱 볼 애니메이션
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BounceBall extends JFrame implements ActionListener{
static final int WIDTH = 600;
static final int HEIGHT = 200;
private static final int PERIOD = 10;
class MyPanel extends JPanel {
int x = 0, y = 0, xInc = 3, yInc = 3, diameter = 60;
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(x < 0 || x > (BounceBall.WIDTH - diameter))
xInc = -xInc;
if(y < 0 || y > (BounceBall.HEIGHT - diameter))
yInc = -yInc;
x += xInc;
y += yInc;
g.setColor(Color.RED);
g.fillOval(x, y, diameter, diameter);
}
}
public BounceBall() {
MyPanel panel = new MyPanel();
panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
add(panel);
pack();
Timer timer = new Timer(PERIOD, this);
timer.start();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] args) {
new BounceBall();
}
}
'Software > JAVA' 카테고리의 다른 글
[JAVA] Day13. 파일 입출력 (0) | 2023.01.18 |
---|---|
[JAVA] Day12. 제네릭과 컬렉션 (0) | 2023.01.11 |
[JAVA] Day10. 스윙 컴포넌트 (0) | 2023.01.09 |
[JAVA] Day9. 이벤트 처리 (2) | 2023.01.08 |
[JAVA] Day8. 자바 GUI 기초 (2) | 2023.01.08 |