자바의 Graphics - 4

mDev_97·2022년 1월 19일
0

Java

목록 보기
25/28
post-thumbnail

repaint() 메소드

• 강제로 컴포넌트를 다시 그리도록 하는 메소드
• 컴포넌트의 페인팅 과정을 진행
• 자바 플랫폼에게 다시 그리도록 지시

component.repaint();

repaint()를 사용하는 경우

• 프로그램 내에서 모양 또는 위치를 변경한 경우
• repaint( ) 호출 시 paintComponent( )가 호출된다.

부모 컴포넌트부터 다시 그리는 것이 좋다!

• 해당 컴포넌트에 repaint( ) 메소드를 호출하면 새로운 위치에 다시 그려진다.
But, 이전에 그려진 모양은 남아있다.
• 이를 해결하기 위해서는 부모 컴포넌트의 repaint( ) 메소드를 호출하는 것이 좋다.

component.getParent().repaint();

revalidate() 메소드

• 컨테이너 배치관리자에게 자식 컴포넌트를 다시 배치하도록 지시하는 메소드

• 컨테이너에 변경이 생기는 경우 사용
-> 프로그램 내에서 컴포넌트 삽입 또는 삭제의 경우

container.revalidate(); // 컴포넌트 재배치를 지시
container.repaint(); // 컨터이너 다시 그리기

예제

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

public class RepaintMethodEx extends JFrame {
    private ExPanel p = new ExPanel();
    
    public RepaintMethodEx() {
        super("repaint() 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(p);
        setSize(500, 500);
        setVisible(true);
    }
    
    class ExPanel extends JPanel {
        // Point 클래스는 java.awt.*에 존재
        private Vector<Point> startVector = new Vector<Point>();
        private Vector<Point> endVector = new Vector<Point>();
        
        public ExPanel() {
            addMouseListener(new MouseAdapter(){
               public void mousePressed(MouseEvent e) {
                   Point startPoint = e.getPoint();
                   startVector.add(startPoint);
               }
               
               public void mouseReleased(MouseEvent e) {
                   Point endPoint = e.getPoint();
                   endVector.add(endPoint);
                   repaint();
               }
            });
        }
        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            
            for(int i=0; i<startVector.size(); i++) {
                Point s = startVector.elementAt(i);
                Point e = endVector.elementAt(i);
                g.drawLine((int)s.getX(), (int)s.getY(), (int)e.getX(), (int)e.getY());
            }
        }
    }
    
    public static void main(String[] args) {
        new RepaintMethodEx();
    }
}

실행 결과

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글

관련 채용 정보