본문 바로가기

BackEnd/Java

[java]이것이 자바다 부록 Java UI 13-2 (Swing을 이용한 2D 그래픽스, Color와 Font)

728x90
반응형

(5) 안티 알리아싱

   ▷ 비트맵 그래픽의 방식은 작은 사각형(픽셀)을 최소 단위로 하기 때문에 이 픽셀들이 모여 만들어진 원, 곡선, 사선은 경계 부분에서 거친 계단 현상(알리어싱aliasing)이 나타남

   ▷ 문제 해결을 위해 안티-알리어싱 기능이 필요

   ▷ 안티알리어싱은 배경색과 이미지 색상의 중간 색상을 단계적으로 채워 경계선을 부드럽게 만들어 주는 기능

   ▷  자바는 안티 알리어싱을 위해 Graphics2D의 setRenderingHint() 메소드를 제공

 

   ▷ paint() 메소드의 매개변수 타입은 Graphics이지만 Graphics2D 객체를 참조하고 있기 때문에 타입 변환을 통해 Graphics2D 객체를 얻고 setRenderingHint() 메소드를 호출 가능

 

 

◎ 안티 알리아싱을 적용하지 않은 원과 적용한 원의 차이점을 보여주는 예제

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class AntiAliasingExample extends JFrame {
	// 메인 윈도우 설정
	public AntiAliasingExample() {
		setTitle("안티알리아싱");
		getContentPane().add(new MyCanvas(), BorderLayout.CENTER);
		setSize(200,300);
	}
	
	// Canvas 클래스 선언
	public class MyCanvas extends Canvas{
		public void paint(Graphics g) {
			// 안티알리어싱을 적용하지 않은 원
			g.fillOval(50, 50, 100, 100);
			
			// 안티알리어싱을 적용한 원
			Graphics2D g2 = (Graphics2D) g;
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
			g.fillOval(50, 200, 100, 100);
		}
	}
	
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            	AntiAliasingExample jFrame = new AntiAliasingExample();
                jFrame.setVisible(true);
            }
        });
    }
}

 


첫 번째 원은 안티알리어싱을 적용하지 않았기 때문에 계단식으로 표현되고 두 번째 원은 적용해서 매끄럽게 나타납니다.

 

(6) 이미지 그리기

   ▷ 이미지를 드로잉하기 위해서는 이미지 파일을 메모리로 로딩해서 Image 객체를 얻어야 함

   ▷ Image 객체를 얻는 방법은 두 가지가 있는데, 첫 번째로는 Toolkit의 getImage() 메소드로 얻을 수 있음

   ▷ 두 번째 방법은 ImageIcon 객체를 생성해서 getImage() 메소드로 얻을 수 있음

   ▷ Graphics의 drawImage() 메소드를 이용함

 

◎ 이미지 파일을 읽고 Canvas에 드로잉하는 예제

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ImageExample extends JFrame {
	// 메인 윈도우 설정
	public ImageExample() {
		setTitle("이미지 그리기");
		getContentPane().add(new MyCanvas(), BorderLayout.CENTER);
		add(new MyCanvas(), BorderLayout.CENTER);
		setSize(500,350);
	}
	
	// Canvas 클래스 선언
	public class MyCanvas extends Canvas{
		private Image imgSun, imgMoon;
		
		public MyCanvas() {
			// 배경을 흰색으로 변경
			setBackground(Color.WHITE);
			
			// 이미지를 로딩해서 읽고, Image 객체 얻기
			Toolkit toolkit = Toolkit.getDefaultToolkit();
			imgSun = toolkit.getImage(getClass().getResource("sun.gif"));
			imgMoon = new ImageIcon(getClass().getResource("moon.gif")).getImage();
		}
		
		public void paint(Graphics g) {
			// 이미지 드로잉
			g.drawImage(imgSun, 10, 10, this);
			g.drawImage(imgMoon, 300, 20, this);			
		}
	}
	
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            	ImageExample jFrame = new ImageExample();
                jFrame.setVisible(true);
            }
        });
    }
}

 

 

 

(7) 배경 이미지 넣기

   ▷ JPanel은 paint() 메소드를 실행할 때 자신의 paintComponent() 메소드를 먼저 호출하고, 자식 컴포넌트의 paint() 메소드를 나중에 호출하도록 되어 있음

   ▷ 배경 그림은 모든 자식 컴포넌트보다 먼저 드로잉되어 자식 컴포넌트 밑에 깔려야 하므로 paintComponent()에서 배경 그림이 드로잉되어야 함

 

 

◎ JPanel에 배경 이미지를 드로잉해서 JTextField와 JButton가 배경 이미지 위에 배치하는 예제

import java.awt.BorderLayout;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class BackgroundImageExample extends JFrame {
	private JTextField txtId;
	private JButton btnLogin;
	
	// 메인 윈도우 설정
	public BackgroundImageExample() {
		this.setTitle("배경 그림 넣기");
		this.getContentPane().add(new MyPanel(), BorderLayout.CENTER);
		this.setSize(200,270);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	// JPanel 클래스 선언
	public class MyPanel extends JPanel{
		public MyPanel() {
			setLayout(null);
			// JTextField JButton 부착
			add(getTextField());
			add(getButton());
		}
	
		@Override
		public void paintComponent(Graphics g) {
			// 배경 그리기
			ImageIcon icon = new ImageIcon(this.getClass().getResource("bg.jpg"));
			g.drawImage(icon.getImage(), 0, 0, this);
		}
	}
	
	// JTextField 생성
	public JTextField getTextField() {
		if(txtId == null) {
			txtId = new JTextField();
			txtId.setBounds(50, 50, 100, 30);
		}
		return txtId;
	}
	
	// JButton 생성
	public JButton getButton() {
		if(btnLogin == null) {
			btnLogin = new JButton("버튼");
			btnLogin.setBounds(50, 50, 100, 30);
		}
		return btnLogin;
	}
	
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            	BackgroundImageExample jFrame = new BackgroundImageExample();
                jFrame.setVisible(true);
            }
        });
    }
}

 

 

Canvas와 Graphics의 메소드를 이용해 안티 알리아싱(테두리 다듬기), 이미지 삽입, 배경 그림 넣기 등을 해보았습니다.

 

이것들을 이용하면 게시판 꾸미기에 유용할 것 같아요~

 

더 많은 기능들에 대해서 배워볼게요~!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형