본문 바로가기
Programming/JAVA

그래픽

by 안녕주 2020. 12. 30.

명품자바프로그래밍 chapter12_lab11

 

실습1| color, font 활용

import java.awt.*;
import javax.swing.*;


public class ColorFontTest extends JFrame{
	public ColorFontTest() {
		setTitle("Color, Font 사용 예제"); //타이틀
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
		
		setContentPane(new MyPanel()); //기본 도화지 세팅
		
		setSize(800,250); // 크기
		setVisible(true); //내용이 보이도록
	}
	
	class MyPanel extends JPanel{
		@Override
		protected void paintComponent(Graphics g) { //그림 그리기 메소드, 오버라이디
			super.paintComponent(g); //무조건 첫줄에 위치
			g.setColor(Color.blue); //글씨 색 설정
			g.setFont(new Font("궁서", Font.BOLD,20)); //글씨 폰트 설정
			g.drawString("국적: 대한민국(궁서 폰트)", 50, 50); //글의 내용 및 위치 설정
			 
			g.setColor(Color.red);
			g.setFont(new Font("휴먼고딕", Font.BOLD,30));
			g.drawString("주소: 서울시 마포구(휴먼고딕 폰트)", 50, 100);
			
			g.setColor(Color.orange);
			g.setFont(new Font("나눔손글씨 펜", Font.BOLD,40));
			g.drawString("성명: 안현주(나눔손글씨 펜 폰트)", 50, 150);
			
			g.setColor(Color.gray);
			g.setFont(new Font("HY나무B", Font.BOLD,10));
			g.drawString("학번: 1911169(HY나무B 폰트)", 50, 200);
			
		}
	}

	public static void main(String[] args) {
		new ColorFontTest();
	}
}

 

실습2| 도형 그리기 및 칠하기

import java.awt.*;
import javax.swing.*;

public class DrawFillTest extends JFrame{

	public DrawFillTest() {
		setTitle("Draw Fill 사용 예제"); //타이틀
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
		Container c = getContentPane(); //컨테이너 생성
		c.setLayout(new GridLayout(0,3)); //GridLayout으로 오른쪽으로 가도록
		c.add(new MyPanel1()); //3개의 Panel을 만들어서 각각 만들기
		c.add(new MyPanel2());
		c.add(new MyPanel3());
		setSize(1000,370); //크기
		setVisible(true); //내용 보이도록 하기
	}
	
	class MyPanel1 extends JPanel{ //막대 그래프 (fillRect)
		@Override
		protected void paintComponent(Graphics g) { //그리기 메소드
			super.paintComponent(g);
			g.drawRoundRect(10,10,300,300,30,30); // round직사각형 각각 그리기
			
			g.setColor(Color.red);
			g.fillRect(50, 50, 40, 250); //각 그림의 위치를 계산해서 해당 색 별로 fillRect
			g.setColor(Color.blue);
			g.fillRect(110, 110, 40, 190);
			g.setColor(Color.orange);
			g.fillRect(170, 160, 40, 140);
			g.setColor(Color.green);
			g.fillRect(230, 110, 40, 190);
			
		}
	}
	
	class MyPanel2 extends JPanel{ //파이차트(fillArc)
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawRoundRect(10,10,300,300,30,30); // round직사각형 각각 그리기
			
			g.setColor(Color.green);
			g.fillArc(50, 50, 230, 230, 330, 110); //330~360 , 0 ~ 80 각도로 따졌을 때
			g.setColor(Color.red);
			g.fillArc(50, 50, 230, 230, 80, 120); //80~ 200
			g.setColor(Color.blue);
			g.fillArc(50, 50, 230, 230, 200, 30); //200~ 230
			g.setColor(Color.yellow);
			g.fillArc(50, 50, 230, 230, 230, 110); //230 ~ 330 
			
		}
	}
	
	class MyPanel3 extends JPanel{ //FillPolygon
		@Override
		protected void paintComponent(Graphics g) { // round직사각형 각각 그리기
			super.paintComponent(g);
			g.drawRoundRect(10,10,300,300,30,30);
			
			int x[] = {160,190,270,210,230,160,90,110,50,130}; //각 점의 위치를 계산해서 그리기
			int y[] = {40,110,120,180,270,230,270,180,120,110};
			g.setColor(Color.magenta);
			g.fillPolygon(x,y,x.length);
			
		}
	}
		

	public static void main(String[] args) {
		new DrawFillTest();
	}
}

 

실습3| 이미지 그리기

import java.awt.*;
import javax.swing.*;

public class ImageTest extends JFrame{
	public ImageTest() {
		setTitle("그래픽 이미지 연습"); //타이틀
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
		
		setContentPane(new MyPanel()); //도화지
		
		setSize(300,300); //크기
		setVisible(true); //보이도록 하기
	}
	
	class MyPanel extends JPanel{
		private ImageIcon icon = new ImageIcon("C:\\Users\\lg\\Desktop\\생활코딩\\자바\\workspace\\Lab12_1\\src\\seoul.jpg"); //그림의 절대경로
		private Image img = icon.getImage(); //이미지 객체
		@Override
		protected void paintComponent(Graphics g) { //이미지 일부분 크기조절 예제12-7
			super.paintComponent(g);
			int x = this.getWidth(); //창의  가로 길이, 창을 임의로 늘렸을 때도 창의 길이를 계산해야하므로 사용
			int y = this.getHeight(); //창의 세로 길이
			int weight = img.getWidth(this); //그림의 가로길이
			int height = img.getHeight(this); //그림의 세로길이
			
			//이미지를 각 4등분해야하고, 상하좌우 10픽셀씩 떨어져서 그려야하므로(각각 5픽셀씩 나누어 계산), 좌표를 각각 계산한다. 
			g.drawImage(img, 0, 0, x/2 - 5, y/2 -5, 0, 0, weight/2, height/2, this); //(0,0) 부터 (창의 절반에 -5,창의 절반의-5) 까지 그릴껀데, 이미지는  해당 맞는 위치의 이미지의 1/4만큼 가져온다.
			g.drawImage(img, x/2 +5, 0, x, y/2 -5, weight/2, 0, weight, height/2, this); //(창의 절반의 +5,0) 부터 (창의 가로 끝,창의 절반-5) 까지 그릴껀데, 이미지는  해당 맞는 위치의  이미지의 1/4만큼 가져온다.
			g.drawImage(img, 0, y/2 +5, x/2 -5, y, 0, height/2, weight/2, height, this); //(0,창의 절반+5) 부터 (창의 절반의-5,창의 세로끝) 까지 그릴껀데, 이미지는 해당 맞는 위치의  이미지의 1/4만큼 가져온다.
			g.drawImage(img, x/2 +5, y/2 +5, x, y, weight/2, height/2, weight, height, this); //(창의 절반 +5,창의절반+5) 부터 (창의 가로끝,창의 세로끝) 까지 그릴껀데, 이미지는 해당 맞는 위치의  이미지의 1/4만큼 가져온다.
			
		}
	}
	
	public static void main(String[] args) {
		new ImageTest();
	}
}

 

실습4| 신호등 예제

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class TrafficTest extends JFrame{
	JButton btn;
	int mode=0;
	public TrafficTest() {
		setTitle("Traffic Test"); //타이틀
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창닫기
		
		Container c = getContentPane();
		c.add(new MyPanel(),BorderLayout.CENTER); //center에 위치하는 Mypanel
		btn = new JButton("traffic light turn on"); //버튼
		btn.addActionListener(new MyListener()); //이벤트에 추가
		c.add(btn,BorderLayout.SOUTH); //south에 위치
		
		setSize(300,500); //크기
		setVisible(true); //화면에 보이도록 하기
	}

	class MyPanel extends JPanel{ //모드값에 따라 repaint mode값 변경... 0(빨),1(초),2(노) 이런식으로
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawOval(80, 80, 100, 100); //검정색 테두리가 있어서 그려주기, default색 은 검정이라 따로 지정해주지 않는다.
			g.drawOval(80, 180, 100, 100);
			g.drawOval(80, 280, 100, 100);
			
			if (mode == 0) { //mode가 0일때 빨간색 색칠
				g.setColor(Color.red);
				g.fillOval(80, 80, 100, 100);
			}
			else if (mode== 1) { //mode가 1일때 초록색 색칠
				g.setColor(Color.green);
				g.fillOval(80, 180, 100, 100);
			}
			else { //mode가 2일때 노란색 색칠
				g.setColor(Color.yellow);
				g.fillOval(80, 280, 100, 100);
			}
		}
	}
	
	private class MyListener implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton)e.getSource(); 
			
			if(b.getText().equals("traffic light turn on")) { // 해당 버튼을 눌렀을 때
				mode++; //mode++ 해야지 기본 빨강에서 다른 색으로 바꿀수 있음
				if(mode>2) //mode가 3이되면 0으로 바꿔주기
					mode =0;
				repaint(); //repaint()해줘야 적용됨
			}
			
		}	
	}
	
	public static void main(String[] args) {
		new TrafficTest();
	}
}

 

실습5| 파이차트만들기

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class PieChartFrame extends JFrame{	
	JTextField tf[] = new JTextField[4]; //4개의 텍스트필드를 받아야함.
	String fruits[] = {"apple","cherry","strawberry","prune"};  //4개의 과일
	Color c[] = {Color.red,Color.blue,Color.magenta,Color.orange}; //4개의 색
	int angles[] = new int[4]; //각각 의 과일에 해당하는 angel값 저장하는 배열
	
	public PieChartFrame() {
		setTitle("파이 차트 그리기"); //타이틀
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
		Container c = getContentPane();
		
		c.add(new MyPanel1(), BorderLayout.NORTH); //텍스트 필드가 위치하는 패널은 north
		c.add(new MyPanel2(), BorderLayout.CENTER); //그림을 그리는 패널은 center
		setSize(800,600); //창 크기
		setVisible(true); //내용물이 보이도록
	}
	
	class MyPanel1 extends JPanel{
		public MyPanel1() {
			setBackground(Color.gray); //뒷배경 색은 회색
			for(int i=0; i<fruits.length;i++) {
				tf[i] = new JTextField(10); //TextField 생성
				tf[i].addActionListener(new MyListener()); //textfield 4개를 다 입력 받았을 때 해당 값을 계산하는 이번트 추가
				add(new JLabel(fruits[i])); //해당 인덱스의 fruits 명을 먼저 추가하고
				add(tf[i]); //해당 인덱스의 tf를 각각 추가한다.
			}
		}	
	}
	
	class MyPanel2 extends JPanel{
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			int angle =0; //시작 부분 0
			for(int i=0;i<fruits.length;i++) {
				g.setColor(c[i]); //색 지정
				g.drawString(fruits[i] + " " + (int)Math.ceil(angles[i]*100/360)+"%", 100+180*i, 50); //텍스트 필드를 출력
				// 과일 이름 + 해당 angles를 백분율로 환산하여 올림한 값, x좌표, y좌표 --> x좌표는 오른쪽으로 이동해야하므로 MyPanel1의 텍스트 필드 아래에 위치하도록 변경
			}
			
			for(int i=0;i<fruits.length;i++) {
				g.setColor(c[i]); //색 지정
				g.fillArc(200, 100, 400, 400, angle, angles[i]); //해당 위치 x,y,width,height ,시작값, 칠할 정도.? / 360도에 환산하여 저장한 angles 만큼 칠한다.
				angle += angles[i]; //시작값은 칠한 값을 더하여, 수정되도록한다.
			}
		}	
	}
	private class MyListener implements ActionListener{
		double n[] = new double[4]; //입력 받은 값을 저장할 배열
		@Override
		public void actionPerformed(ActionEvent e) { //textfield로 받은 값 정수화하기
			double sum =0;
			for(int i=0;i<fruits.length;i++) {
				n[i] = Integer.parseInt(tf[i].getText()); //해당 필드에서 입력받은 내용을 n 배열에 저장
				sum += n[i]; //sum 에 해당 내용을 누적합한다.
			}
			for(int i=0;i<fruits.length;i++) { //앵글값구하기
				angles[i] = (int)Math.ceil((n[i]/sum*360)); //angle배열에 해당 입력받은 값을 360도를 기준으로 환산하여 구한다. ceil은 올림 함수.
			}
			
			repaint(); //repaint해야지 적용됨
		}	
	}
	
	public static void main(String[] args) {
		new PieChartFrame();
	}
}

댓글