2014-03-27 3 views
0

스윙에 문제가있어, paintComponent가 어떻게 작동하는지 이해하려고 노력하고 있는데,이 경우 두 번 또는 심지어 세 번 호출됩니다. (무작위 인 것처럼 보입니다. 나에게 전화했다. 나는 다른 프로젝트에서 일하고 있어요 그리고 내가 한 번만 호출 할 수 싶습니다 반면 내 paintComponent에도 여러 번 호출되는 그것은 앞으로에서 저를 방지paintComponent의 무작위 호출

package paintComponentTest; 

import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class UI { 

public static void main(String[] args) { 
    JFrame testFrame = new JFrame(); 

    TestPanel testPanel = new TestPanel(); 
    testFrame.setContentPane(testPanel); 

    testFrame.setSize(500, 500); 
    testFrame.setVisible(true); 
} 
} 

class TestPanel extends JPanel { 

@Override 
public void paintComponent(Graphics g) { 
    System.out.println("Called"); 
} 
}  

.

미리 감사드립니다.

+1

필자가'paintComponent'를 한번만 호출하기를 원하는 이유에 대한 정보는 회화의 작동 방식이 아니기 때문에 (또는 작동 할 수 있기 때문에) 문제에 대한 해결책을 제공 할 수있는 길을 간다.) – MadProgrammer

답변

3

기본적으로 그림은 사용자의 제어 범위를 벗어나므로 사용자가 할 수있는 작업은 거의 없습니다.

paintComponent (직접 또는 부모 컨테이너의 크기가 조정 되었기 때문에) 컴포넌트가 크기 조정되었거나 컨테이너 크기가 조정 되었기 때문에 재 페인트 관리자가 구성 요소를 다시 그려야한다고 결정한 경우 (간접적으로) 호출됩니다. 표시 가능 (화면에 표시되거나 표시 가능한 구성 요소에 추가됨) 및 여러 시스템 이벤트가 될 수 있습니다.

맞춤 페인트를 수행하기 전에 먼저 super.paintComponent을 호출하는 것 외에 다른 작업을 수행해야합니다. 사용자가 페인트 프로세스에 대해 가지고 있다고 생각할 수있는 착각을 포기하는 것입니다.

다음으로 Painting in AWT and Swing을 읽고 그림 프로세스가 어떻게 작동하는지 이해해야합니다.

+0

빨리 답변 해 주셔서 감사합니다. 필자는'paintComponent'에서 다시 칠하기 전에'super.paintComponent'를 가지고 있습니다. 사실, 저는'paintComponent'에서 처리해야 할 것이 있습니다. 그리고 처음에는 처리되지 않습니다. 모든 것이 만들어지지 않았기 때문에 .... 처리하지 않을 것입니다. 세부 사항을하지만 내 JPanel'paintComponent'의 두 번째 호출을 기다려야합니다. 그렇지 않으면 작동하지 않습니다. 결과적으로 나는 처음 전화를 받았는지를 확인하기 위해 플래그를 사용하고 있는데, 매우 추한 것을 알았지 만, 그렇지 않으면 어떻게해야하는지 알지 못합니다. 어쨌든, 고맙습니다. 나는이 기사를 읽을 것입니다. –

+0

해결책은'BufferedImage'를 사용하여 준비가되면 원하는 것을 페인트 한 다음'paintComponent' 메소드에'BufferedImage'를 칠하는 것입니다. 이것에 대한 두 가지 이유가 있습니다. 당신은 제어권을 얻고 그림은 가능한 한 빨리 끝내야합니다. 그러면 응용 프로그램의 반응성에서 가능한 지연을 막을 수 있습니다 ... – MadProgrammer

+0

@ user2007740'** 반드시 ** paintComponent'에서 수행해야하는 처리 수준이 있어서는 안됩니다 일단. init 메소드와 생성자를 사용하여 "일회성"객체를 얻을 수 있어야합니다. – MirroredFate