2016-11-02 8 views
0

나는 자바 페인트를 배우기를 원하고 그래서 어떻게 자바 페인트를하고 다시 칠하는지 이해할 수있는 코드를 만들었습니다. 여기에 2 개의 코드 샘플이 있는데 그 차이점은 무엇입니까? 왜 일을 다시 칠하지 않습니까?Java repaint()는 어떻게 작동합니까?

첫 번째 코드 샘플 (작동)

package com.oguz; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class PaintTest3 extends JFrame{ 
    JPanel panel1; 
    int i = 1; 
    public PaintTest3() { 
     panel1 = new JPanel(); 
     JButton btn = new JButton("Button"); 
     btn.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       i++; 
       Graphics g = panel1.getGraphics(); 
       g.setColor(Color.BLACK); 
       g.drawLine(10, 10, i * 5, 10); 
      } 
     }); 
     add(panel1); 
     add(btn, BorderLayout.NORTH); 
    } 
    public static void main(String args[]){ 
     PaintTest3 pt = new PaintTest3(); 
     pt.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pt.setSize(600, 500); 
     pt.setVisible(true); 
    } 
} 
+0

차이점을 먼저 알려 주시면 문제의 중요성을 알려 드리겠습니다. –

답변

1

두 번째 버전을 사용해 보았지만 완벽하게 작동합니다. 내가 바꾸어야했던 유일한 것은 줄을 더 내려가는 것이 었습니다 : g.drawLine(10, 100, i * 5, 100); 버튼 뒤에 그려져 있기 때문입니다. 이상적으로 영역을 그릴 경우 JPanel을 사용자 정의 paint으로 확장하고 버튼 아래에 놓습니다.

다시 그리기를 설명하려면 '다시 그리기'의 요점은 구성 요소를 다시 그려야하는 항목을 변경했다는 것을 창 관리자에게 알려주는 것입니다. 다시 그리기 작업은 paint을 사용하여 언젠가 (실제로는 다른 스레드에서) 나중에 발생합니다. 창 관리자는 여러 재 페인트 호출에 대해 한 번 칠할 수 있습니다 (충분히 빠르게 발생하는 경우). 자신의 코드에 paint으로 전화해서는 안됩니다. 코드를 구현하고 필요할 때 시스템에서 호출하도록하십시오.

첫 번째 구현의 문제점은 버튼을 누르지 않고 페인트를 사용해야하는 경우 아무런 문제가 발생하지 않는다는 것입니다. 예를 들어 창 크기를 조정하거나 최소화/최대화하는 경우를 예로들 수 있습니다.

요약하면, 두 번째 구현은 정확하고 선을 올바르게 배치해야하며 이상적으로는 프레임이 아닌 패널에 그려야합니다.

0

칠하고()는

public void paint(Graphics g){} 

메소드를 호출합니다. 이것은 페인트 프로세스가 더 큰 프로그램에서 여러 번 호출되기 때문에 코딩 프로세스를 쉽게하기위한 것입니다. 매번 Graphics 객체를 매개 변수로 전달해야합니다. 이것을 최소화하기 위해 우리는 페인트 칠을한다.

+0

하지만 게시 된 두 번째 샘플이 작동하지 않습니다. actionPerformed에서 repaint()를 사용했습니다. –

+0

@ user125318 그러면 질문 제목이 완전히 오도 할 수 있습니다. – byxor

+0

왜? 나는 repaint()의 작업을 이해하지 못한다. repaint()가 Shree Naath와 같이 작동하는 이유는 두 번째 샘플이 작동하지 않는 이유입니다. –