11.1 스윙 컴포넌트 그리기
컴포넌트는 자신의 모양을 스스로 그린다
paintComponent()
: 스윙 컴포넌트가 자신의 모양을 그리는 메소드
public void paintComponent(Graphics g)
paintComponent()의 오버라이딩
: 개발자가 JComponent를 상속받아 새로운 컴포넌트를 설계하든지 아니면 기존의 스윙 컴포넌트 모양에 변화를 주고자 할 때
JPanel에 그리기
- JPanel: 아무 모양도 없는 텅 빈 컴포넌트이면서 컨테이너
/*
* JPanel을 상속받은 패널에 도형 그리기
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class paintJPanelEx extends JFrame {
public paintJPanelEx() {
setTitle("JPanel의 paintComponent() 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel()); // MyPanel 패널을 컨텐트팬으로 사용
setSize(250,200);
setVisible(true);
}
// JPanel을 상속받는 새 패널 구현
class MyPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g); // JPanel의 paintComponent() 호출
g.setColor(Color.BLUE); // 파란색 선택
g.drawRect(10, 10, 50,50); // (10,10) 위치에 50x50 크기의 사각형
g.drawRect(50, 50, 50, 50);
g.setColor(Color.MAGENTA);
g.drawRect(90, 90, 50, 50);
}
}
public static void main(String[] args) {
new paintJPanelEx();
}
}
11.2 Graphics
그래픽 기반 GUI 프로그래밍
▶ 그래픽: 개발자가 스윙 컴포넌트에 의존하지 않고 선, 원, 이미지 등을 이용하여 직접 화면을 구성하는 기능
Graphics
문자열 그리기
색상과 폰트, Color와 Font
Graphics에서 색상과 폰트 활용
/*
* 예제 11-2
*/
import javax.swing.*;
import java.awt.*;
public class GraphicsColorFontEx extends JFrame {
public GraphicsColorFontEx() {
setTitle("문자열, Color, Font 사용 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel()); // MyPanel
setSize(300,300);
setVisible(true);
}
// JPanel을 상속받아 새 패널 구현
class MyPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawString("자바가 정말 재밋다~~", 30, 30);
g.setColor(Color.RED);
g.setFont(new Font("Arial", Font.ITALIC, 30));
g.drawString("How much?", 30,70);
g.setColor(new Color(0x00ff00ff)); // r = ff, g = 00, b = ff (보라색)
for(int i=1; i<=4; i++) {
g.setFont(new Font("Jokerman", Font.ITALIC, i*10));
g.drawString("This much!", 30, 60 + i*40);
}
}
}
public static void main(String[] args) {
new GraphicsColorFontEx();
}
}
11.3 도형 그리기와 칠하기
도형 그리기
/*
* 예제 11-3: Graphics의 drawLine()을 이용하여 선 그리기
*/
import javax.swing.*;
import java.awt.*;
public class GraphicsDrawLineEx extends JFrame {
public GraphicsDrawLineEx() {
setTitle("drawLine 사용 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel());
setSize(200,150);
setVisible(true);
}
// MyPanel
class MyPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawLine(20, 20, 100, 100); // (20,20)~(100,100)
}
}
public static void main(String[] args) {
new GraphicsDrawLineEx();
}
}
원호와 폐다각형 그리기
도형 칠하기
/*
* 예제 11-4: 도형 칠하기
*/
import javax.swing.*;
import java.awt.*;
public class GraphicsFillEx extends JFrame {
public GraphicsFillEx() {
setTitle("fillxxx 사용 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel()); // MyPanel
setSize(100,350);
setVisible(true);
}
// MyPanel
class MyPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(10, 10, 50, 50);
g.setColor(Color.BLUE);
g.fillOval(10,70,50,50);
g.setColor(Color.GREEN);
g.fillRoundRect(10, 130, 50, 50, 20, 20);
g.setColor(Color.MAGENTA);
g.fillArc(10, 190, 50, 50, 0, 270);
g.setColor(Color.ORANGE);
int [] x = {30,10,30,60};
int [] y = {250,275,300,275};
g.fillPolygon(x,y,4); // 다각형 칠하기
}
}
public static void main(String[] args) {
new GraphicsFillEx();
}
}
11.4 이미지 그리기
이미지 그리는 2가지 방법
Graphics의 drawImage() 메소드
Graphics의 이미지 그리기
/*
* 예제11-5: 원본 크기로 이미지 그리기
*/
import javax.swing.*;
import java.awt.*;
public class GraphicsDrawImageEx1 extends JFrame {
public GraphicsDrawImageEx1() {
setTitle("원본 크기로 원하는 위치에 이미지 그리기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel()); // MyPanel
setSize(300,400);
setVisible(true);
}
class MyPanel extends JPanel {
private ImageIcon icon = new ImageIcon("images/image0.jpg"); // 이미지 로딩
private Image img = icon.getImage(); // 이미지 객체
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 이미지를 패널의 (20,20)에 원래의 크기로 그린다.
g.drawImage(img, 20, 20, this);
}
}
public static void main(String[] args) {
new GraphicsDrawImageEx1();
}
}
/*
* 예제 11-6: JPanel 크기에 맞추어 이미지 그리기
*/
import javax.swing.*;
import java.awt.*;
public class GraphicsDrawImageEx2 extends JFrame {
public GraphicsDrawImageEx2() {
setTitle("패널의 크기에 맞추어 이미지 그리기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel());
setSize(200,300);
setVisible(true);
}
class MyPanel extends JPanel{
private ImageIcon icon = new ImageIcon("imgaes/image0.jpg"); // 이미지 로딩
private Image img = icon.getImage(); // 이미지 객체
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 이미지를 패널 크기로 조절하여 그린다.
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
public static void main(String[] args) {
new GraphicsDrawImageEx2();
}
}
11.5 repaint()와 그래픽 응용
repaint()
: 개발자는 프로그램에서 컴포넌트의 색, 모양, 크기, 텍스트 등을 변경한 후 repaint()를 호출하여, 자바 플랫폼이 컴포넌트의 paintComponent()를 호출하도록 해야 한다.
repaint()와 마우스를 이용한 응용
/*
* 예제 11-7: repaint()와 마우스를 이용한 타원 그리기
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GraphicsDrawOvalMouseEx extends JFrame {
public GraphicsDrawOvalMouseEx() {
setTitle("마우스 드래깅으로 타원 그리기 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel());
setSize(300,300);
setVisible(true);
}
// 타원을 그릴 패널 작성. 이 패널에 마우스 리스너 구현
class MyPanel extends JPanel{
private Point start=null, end=null; // 마우스의 시작점과 끝점
public MyPanel() {
MyMouseListener listener = new MyMouseListener(); // 리스너 생성
// listener를 아래 두 리스너로 공통으로 등록해야 한다.
addMouseListener(listener); // Mouse 리스너 등록
addMouseMotionListener(listener); // MouseMotion 리스너 등록
}
class MyMouseListener extends MouseAdapter{ // 마우스 리스너
public void mousePressed(MouseEvent e) {
start=e.getPoint(); // 마우스 포인터(시작점)를 start 객체에 저장
}
public void mouseDragged(MouseEvent e) {
end = e.getPoint(); // 마우스 포인터(끝점)를 end 객체에 저장
repaint();
}
}
// 패널에 타원 그리기
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(start == null) // 타원이 만들어지지 않았음
return;
g.setColor(Color.BLUE);
int x = Math.min(start.x, end.x);
int y = Math.min(start.y, end.y);
int width = Math.abs(start.x - end.x);
int height = Math.abs(start.y - end.y);
g.drawOval(x, y, width, height); // 타원 그리기
}
}
public static void main(String[] args) {
new GraphicsDrawOvalMouseEx();
}
}
/*
* 예제 11-8: repaint()와 마우스를 이용한 여러 개의 선 그리기
*/
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class GraphicsDrawLineMouseEx extends JFrame {
public GraphicsDrawLineMouseEx() {
setTitle("마우스로 여러 개의 선 그리기 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(new MyPanel());
setSize(300,300);
setVisible(true);
}
public static void main(String[] args) {
new GraphicsDrawLineMouseEx();
}
class MyPanel extends JPanel{
private Vector<Point> vStart = new Vector<Point>();
private Vector<Point> vEnd = new Vector<Point>();
public MyPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
Point startP = e.getPoint();
vStart.add(startP);
}
public void mouseReleased(MouseEvent e) {
Point endP = e.getPoint();
vEnd.add(endP);
repaint();
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
for(int i=0; i<vStart.size(); i++) {
Point s = vStart.elementAt(i);
Point e = vEnd.elementAt(i);
g.drawLine((int)s.getX(), (int)s.getY(), (int)e.getX(), (int)e.getY());
}
}
}
}
'Programming > Java프로그래밍및실습' 카테고리의 다른 글
[자프실] 12. 자바 스레드 기초 (0) | 2024.01.15 |
---|---|
[자프실] 10. 스윙 컴포넌트 활용 (1) | 2024.01.13 |
[자프실] 9. 자바의 이벤트 처리 (1) | 2024.01.11 |
[자프실] 8. 자바 GUI 스윙 기초 (1) | 2024.01.10 |
[자프실] 7. 컬렉션과 제네릭 (0) | 2024.01.07 |