자바에서 그림을 그리려면 paint() 매소드를 이용합니다. 이미지 그림을 갱신하고 싶을 때는 repaint() 를 이용해서 그림을 다시 그릴 수 있습니다.



paint() 매소드

애플릿에 그림을 그리려 할 때 발생하는 그래픽 출력 이벤트입니다. 형식은 다음과 같습니다.

// ex.1)
import java.awt.Graphics;
import javax.swing.JFrame;
 
public class Ex01 extends JFrame{
     
    @Override
    public void paint(Graphics g) {
        super.paint(g);
    }
     
    public Ex01() {     
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
    }
     
    public static void main(String[] args) {
        new Ex01();
    }
}


다음은 paint() 매소드를 이용해 호를 그려 보겠습니다.

 
// ex.2)
import java.awt.Graphics;
import javax.swing.JFrame;
 
public class Ex01 extends JFrame{
     
    @Override
    public void paint(Graphics g) {
        super.paint(g);
         
        // 채워진 호를 그립니다.
        // x/y 좌표 100, 크기가 100 이고,
        // 시작점과 끝점이 각 50과 100인 호를 그립니다.
        g.fillArc(100, 100, 100, 100, 50, 100);
    }
     
    public Ex01() {
         
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
    }
     
    public static void main(String[] args) {
        new Ex01();
    }
}



repaint() 매소드

강제로 한번더 호출하고자 할때 사용합니다. 다음은 기본적인 문법입니다.

// ex.3)
import java.awt.Graphics;
import javax.swing.JFrame;
 
public class Ex01 extends JFrame{
     
    @Override
    public void paint(Graphics g) {
        super.paint(g);
         
        g.fillArc(100, 100, 100, 100, 50, 100);
    }
     
    public Ex01() {
        // repaint() 를 호출합니다.
        repaint();
 
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
    }
     
    public static void main(String[] args) {
        new Ex01();
    }
}


다음은 랜덤함수를 이용해 repaint() 를 호출해 보겠습니다.

 
// ex.4)
import java.awt.Graphics;
 
import javax.swing.JFrame;
 
public class Ex04 extends JFrame{
     
    public Ex04() {
        setSize(300, 300);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        // 매 0.5 초 마다 새로운 폴리곤을 그리기 위해 반복문을 이용
        while(true) {
            try {
                Thread.sleep(500);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            // 폴리곤을 새로 그려야 하므로 repaint() 를 호출
            repaint();
        }
         
    }
    public void paint(Graphics g) {
        super.paint(g);
         
        int x[] = {
                (int)(Math.random()*300),
                (int)(Math.random()*300),
                (int)(Math.random()*300)
        };
        int y[] = {
                (int)(Math.random()*300),
                (int)(Math.random()*300),
                (int)(Math.random()*300)
        };
        g.drawPolygon(x, y, 3);     
    }
     
    public static void main(String[] args) {
        new Ex04();
    }
}



paint() 매소드

활용 다음은 GroupLayout 을 이용해 로또번호 추첨 그림을 그려 보았습니다.

 

// ex.5)
import javax.swing.JFrame;
 
import java.awt.Container;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Color;
 
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JPanel;
 
public class Ex03 extends JFrame{
    Container c = getContentPane();
    private JLabel clb1, clb2, clb3;
    private JLabel lb1, lb2, lb3, lb4, lb5, lb6;
    private JTextField bf1, f1, f2, f3, f4, f5, f6;
    private JPanel panel, pane2;
    private JButton bbtn1;
     
 
    public Ex03() {
        clb1 = new JLabel("행운의 로또 추첨 번호");
        clb1.setFont(new Font("굴림", Font.BOLD, 21));
        clb2 = new JLabel("꽝입니다. 다시 추첨해 주세요.");
        clb3 = new JLabel("분명 행운이 따를꺼에요!");
         
         
        // 로또 번호 입력 / 패널
        panel = new JPanel();
        lb1 = new JLabel("1");
        panel.add(lb1);
        f1 = new JTextField();
        panel.add(f1);
        f1.setColumns(3);
        lb2 = new JLabel("2");
        panel.add(lb2);
        f2 = new JTextField();
        f2.setColumns(3);
        panel.add(f2);
        lb3 = new JLabel("3");
        panel.add(lb3);
        f3 = new JTextField();
        f3.setColumns(3);
        panel.add(f3);
        lb4 = new JLabel("4");
        panel.add(lb4);
        f4 = new JTextField();
        f4.setColumns(3);
        panel.add(f4);
        lb5 = new JLabel("5");
        panel.add(lb5);
        f5 = new JTextField();
        f5.setColumns(3);
        panel.add(f5);
        lb6 = new JLabel("6");
        panel.add(lb6);
        f6 = new JTextField();
        f6.setColumns(3);
        panel.add(f6);
         
        // 하단 패널
        pane2 = new JPanel();
        pane2.add(new JLabel("추첨"));
        bf1 = new JTextField();
        pane2.add(bf1);
        bf1.setColumns(10);
        pane2.add(new JButton("다음 기회에..."));
         
         
        GroupLayout groupLayout = new GroupLayout(getContentPane());
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
                        .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(clb1))
                        .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup()
                            .addGap(30)
                            .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                                .addComponent(clb2)
                                .addComponent(clb3)
                                .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
                                    .addComponent(pane2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(panel, Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 330, GroupLayout.PREFERRED_SIZE)))))
                    .addContainerGap(42, Short.MAX_VALUE))
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.TRAILING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(clb1)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(panel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(clb2)
                    .addPreferredGap(ComponentPlacement.UNRELATED)
                    .addComponent(clb3)
                    .addGap(112)
                    .addComponent(pane2, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap())
        );
        c.setLayout(groupLayout);
         
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(370, 300);
    }
     
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.yellow);
        g.fillOval(10, 180, 50, 50);
        g.setColor(Color.BLACK);
        g.setFont(new Font("궁서", Font.BOLD, 18));
        g.drawString("23", 25, 210);
         
        g.setColor(Color.yellow);
        g.fillOval(70, 180, 50, 50);
        g.setColor(Color.BLACK);
        g.setFont(new Font("궁서", Font.BOLD, 18));
        g.drawString("23", 85, 210);
         
        g.setColor(Color.blue);
        g.fillOval(130, 180, 50, 50);
        g.setColor(Color.white);
        g.setFont(new Font("궁서", Font.BOLD, 18));
        g.drawString("23", 145, 210);
         
        g.setColor(Color.red);
        g.fillOval(190, 180, 50, 50);
        g.setColor(Color.white);
        g.setFont(new Font("궁서", Font.BOLD, 18));
        g.drawString("23", 205, 210);
         
        g.setColor(Color.red);
        g.fillOval(250, 180, 50, 50);
        g.setColor(Color.white);
        g.setFont(new Font("궁서", Font.BOLD, 18));
        g.drawString("23", 265, 210);
         
        g.setColor(Color.blue);
        g.fillOval(310, 180, 50, 50);
        g.setColor(Color.white);
        g.setFont(new Font("궁서", Font.BOLD, 18));
        g.drawString("23", 325, 210);
    }
    public static void main(String[] args) {
        new Ex03();
    }
}


0 댓글