본문 바로가기

Swing/JPanel paintComponent()

JPanel paintComponent() example

버튼을 누르면 JPanel.paintComponent()를 이용하여 도형 그리기


package swing.test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

public class MainFrame extends JFrame{

	MyPanel mp;
	
	public static void main(String[] args) {

		MainFrame mf = new MainFrame("Swing Test");

	}
	
	MainFrame(String title) {
		super(title);
		this.setLayout(null);
		this.setBounds(100, 100, 800, 600); // 윈도우의 위치와 크기 지정
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JButton btn = new JButton("이동");
		btn.setBounds(100, 50, 100, 30);
		this.getContentPane().add(btn);
		btn.addActionListener(new ActionListener() {
			Random rd = new Random();
			@Override
			public void actionPerformed(ActionEvent e) {
				// MyPanel의 x, y 변수에 값을 설정하고 MyPanel을 다시 그린다
				mp.x = rd.nextInt(mp.getWidth());
				mp.y = rd.nextInt(mp.getHeight());
				
				mp.c = new Color(rd.nextInt(255)+1,rd.nextInt(255)+1,rd.nextInt(255)+1);

				mp.repaint();
			}
		});

		mp = new MyPanel();
		this.getContentPane().add(mp);

		this.setVisible(true);
	}

}

class MyPanel extends JPanel {

	int x, y; 	// Frame 내의 버튼을 누르면 이들 변수의 값이 할당됨
	Color c;	// Frame 내의 버튼을 누르면 색상이 결정됨

	MyPanel() {
		this.setBackground(Color.ORANGE);
		this.setBounds(100, 100, 500, 400);
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g); // 기존에 그려진 화면을 지정된 배경색으로 지우는 역할을 한다

		Graphics2D g2d = (Graphics2D)g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
		        RenderingHints.VALUE_ANTIALIAS_ON);

		g2d.setColor(Color.ORANGE); // 배경색 지정

		g2d.setColor(Color.BLACK);
		g2d.drawOval(100, 100, 100, 100);
		
		g2d.setColor(Color.RED);
		g2d.fillOval(200, 100, 100, 100);
		
		if(x!=0 && y!=0) {
			g2d.setColor(c);
			g2d.fillRoundRect(x, y, 50, 50, 10, 10);
		}
	}

}