본문 바로가기

JAVA/공부

12. 그래픽

8. 마우스를 찍어 중심을 잡고 드래깅하여 놓으면 원을 그리는 코드를 작성하라.

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
	
public class eight extends JFrame{
	MyPanel Panel=new MyPanel();
	public eight() {
		setTitle("마우스로 원 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setContentPane(Panel);
		
		setSize(700,500);
		setVisible(true);
	}
	class MyPanel extends JPanel{
		private Vector<Point> start=new Vector<Point>();
		private Vector<Point> end=new Vector<Point>();
		public MyPanel() {
			addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					start.add(e.getPoint());
				}
				public void mouseReleased(MouseEvent e) {
					end.add(e.getPoint());
					repaint();
				}
			}
		);}
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.red);
			for(int i=0;i<start.size();i++) {
				Point s=start.get(i);
				Point e=end.get(i);
				double radius=Math.sqrt(Math.pow(Math.abs(s.getX()-e.getX()),2)+Math.pow(Math.abs(s.getY()-e.getY()),2));
				g.drawOval((int)Math.abs(s.getX()-radius), (int)(Math.abs(s.getY()-radius)), (int)radius*2, (int)radius*2);
		}
	}}
	public static void main(String[]args) {
		new eight();
	}
}

 

 

 

9. JLabel을 상속받고 배경색이 항상 파란색인 BlueLabel 컴포넌트를 작성하라. setBackground() 메소드를 이용하여도 BlueLabel은 배경색을 변경할 수 없도록 하라. BlueLabel을 만드는 방법은 두 가지가 있다. BlueLabel의 paintComponent()메소드를 오버라이딩하여 강제로 파란 배경색을 칠하는 방법과 setBackground()메소드를 오버라이딩하여 외부에서 칠하는 색을 무시하고 파란색으로 칠하는 방법이다. 두 방법 중 한 가지를 사용하라.

 

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

public class nine extends JFrame{
	public nine() {
		setTitle("Blue Label 만들기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		BlueLabel bl=new BlueLabel("hello");
		bl.setBackground(Color.red);//배경색 변경
		bl.setForeground(Color.white);
		bl.setOpaque(true);
		
		BlueLabel bbl=new BlueLabel("Big Hello");
		bbl.setFont(new Font("Serif",Font.ROMAN_BASELINE,50));
		bbl.setForeground(Color.magenta);
		bbl.setBackground(Color.red);//배경색 변경
		bbl.setOpaque(true);
		
		c.add(bl);
		c.add(bbl);
		
		setSize(400,300);
		setVisible(true);
	}
	class BlueLabel extends JLabel{
		public BlueLabel(String s) {
			super(s);
		}
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			setBackground(Color.blue);
	}
	}
	public static void main(String[]args) {
		new nine();
	}
}

 

 

 

10. paintComponent()를 사용하여 이미지를 패널에 출력할 때 4등분하고, 서로 상, 하, 좌, 우 10픽셀씩 떨어져서 그려지도록 하라. 이미지는 컴포넌트를 사용하지 말고 그래픽으로만 구현하라. 동일한 이미지를 4번 로딩하여도 안 된다. GridLayout을 사용해도 안 된다.

 

import javax.swing.*;
import java.awt.*;
public class ten extends JFrame{
	private MyPanel panel=new MyPanel();
	public ten(){
		setTitle("그래픽 이미지 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setContentPane(panel);
		
		setSize(730,490);//360 240 
		setVisible(true);
	}
	class MyPanel extends JPanel{
		private ImageIcon icon=new ImageIcon("images/022.jpg");
		private Image img=icon.getImage();
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(img,0,0,getWidth()/2-5,getHeight()/2-5,	0,0,960,540, this);//앞의 좌표 4개 패널구역/뒤의 좌표 4개 사진구역
			g.drawImage(img, getWidth()/2+5,0,getWidth(),getHeight()/2-5, 	960, 0, 1920, 540, this);
			g.drawImage(img,0,getHeight()/2+5,getWidth()/2-5,getHeight(),0,540,960,1080,this);
			g.drawImage(img,getWidth()/2+5,getHeight()/2+5,getWidth(),getHeight(),960,540,1920,1080,this);
		}
	}
	public static void main(String[]args) {
		new ten();
	}
}

 

 

 

11. 파이 차트를 만들어보자. 다음 그림과 같이 apple, chrrey, strawberry, prune의 4가지 종류의 과일 판매량을 입력하고 <Enter>키를 치면 전체 판매량에서 백분율(%)을 계산하여 문자열과 파이 차트로 동시에 출력되도록 하라. JTextField 창에 <Enter>키를 치면 Action 이벤트가 발생하는데 Action 리스너를 작성하여 백분율을 계산하고 파이 차트를 그리면 된다.

 

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

public class eleven extends JFrame{
	JPanel jp=new JPanel();
	MyPanel panel=new MyPanel();
	String[]fruits= {"apple","cherry","strawberry","prune"};
	JLabel[]jl=new JLabel[4];
	JLabel[]jl2=new JLabel[4];
	JTextField []jt=new JTextField[4];
	int []key=new int[4];//입력값
	int []ans=new int[4];//백분율
	int []ang=new int[4];//각도
	Color []col= {Color.red,Color.blue,Color.magenta,Color.yellow};
	public eleven() {
		setTitle("파이 차트 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(new BorderLayout());
		
		jp.setLayout(new FlowLayout());
		jp.setBackground(Color.LIGHT_GRAY);
		for(int i=0;i<fruits.length;i++) {
			jl[i]=new JLabel(fruits[i]);
			jt[i]=new JTextField(5);
			jt[i].addActionListener(new MyActionListener());
			jp.add(jl[i]);
			jp.add(jt[i]);
		}

		panel.setLayout(null);
		for(int i=0;i<fruits.length;i++) {
			jl2[i]=new JLabel();
			panel.add(jl2[i]);
			jl2[i].setSize(120,20);
			jl2[i].setFont(new Font("Serif",Font.BOLD,16));
			jl2[i].setLocation(50+i*130, 0);
		}
		c.add(jp,BorderLayout.NORTH);
		c.add(panel,BorderLayout.CENTER);
		
		setSize(600,500);
		setVisible(true);
	}
	class MyPanel extends JPanel{
		public MyPanel() {
			addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					System.out.println("click");
				}
			});
		}	
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.red);
			g.fillArc(getWidth()/2-150, 100, 300, 300, 0, ang[0]);
			g.setColor(Color.blue);
			g.fillArc(getWidth()/2-150, 100, 300, 300, ang[0], ang[1]);
			g.setColor(Color.magenta);
			g.fillArc(getWidth()/2-150, 100, 300, 300, ang[0]+ang[1], ang[2]);
			g.setColor(Color.yellow);
			g.fillArc(getWidth()/2-150, 100, 300, 300, ang[0]+ang[1]+ang[2], ang[3]);
		}
	}
	class MyActionListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			double sum=0;
			for(int i=0;i<key.length;i++) {
				key[i]=Integer.parseInt(jt[i].getText());
				sum+=key[i];
			}
			for(int i=0;i<key.length;i++) {
				ans[i]=(int) Math.round(key[i]/sum*100);
				ang[i]=(int)Math.round(ans[i]*3.6);
			}
			for(int i=0;i<fruits.length;i++) {
				jl2[i].setText(fruits[i]+" "+ans[i]+"%");
				jl2[i].setForeground(col[i]);
			}
			panel.repaint();
		}	
	}
	public static void main(String[]args) {
		new eleven();
	}
}

 

'JAVA > 공부' 카테고리의 다른 글

14. 고급 스윙 컴포넌트  (0) 2021.02.15
13. 스레드와 멀티태스킹  (0) 2021.02.03
11. 기본적인 스윙 컴포넌트와 활용  (0) 2021.01.23
10. 자바의 이벤트 처리  (0) 2021.01.19
9. 자바 GUI 기초, AWT와 스윙(Swing)  (0) 2021.01.19