두 가지 페인트 방법을 사용하여 이전 "페인트"방법으로 생성 된 "그림"을 기반으로 출력을 만드는 프로그램을 작성했습니다. draw1과 draw2의 두 가지 메소드가 있으며, 초기 구성은 draw1을 사용하여 주어진 다음 draw2는 다음 행의 출력을 생성하는 데 사용됩니다. 그러나 코드를 실행할 때 정의 된 메서드가 호출되는 순서와 관련하여 이상한 오류가 발생합니다. 이 코드를 이해하기 위해 여러 개의 print() 문을 코드에 추가했지만 print() 문을 추가하면 메서드 호출 자체에 영향을주는 것으로 보아 문제가 심각해질뿐입니다. 이 코드를 실행하면모호하고 일관성없는 순서의 메서드 호출
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.image.BufferedImage;
public class Processor extends JFrame
{
static int x=1;
public Processor()
{
setTitle("Automaton");
setSize(1000,1000);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
System.out.println("In constructor");
}
public void paint(Graphics g)
{
if(x==1)
draw(g);
else if(x==2)
draw2(g);
}
public void draw(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(0,0,1000,1000);
System.out.println("In Draw");
}//This is the initial setting.
public void draw2(Graphics g)
{
g.setColor(Color.BLACK);
g.fillRect(500,22,50,50);
System.out.println("In Draw2");
}
public static BufferedImage toBufferedImage(Component component)
{
BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
component.paint(g);
return image;
}
public static void main(String[]args)
{
System.out.println("Start");
BufferedImage image;
Processor t=new Processor();
System.out.println("Middle");
image=toBufferedImage(t);
System.out.println("End");
//Color myColor=new Color(image.getRGB(500,500));
x=2;
image=toBufferedImage(t);
}
}
, 나는 빈 흰색 화면 -
Start
In Draw
In constructor
Middle
In Draw
In Draw
End
In Draw2
두와 함께 다음과 같은 출력을 얻을 - 여기
은 (여전히 아주 기본 버전) 코드입니다 질문에서 내 마음에 와서이1)
image=toBufferedImage(t);
의 실행을 수행하는 이유
draw()가 두 번 호출됩니까?
2) "In draw2"행에서 알 수 있듯이 프로그램이 draw2()를 입력했습니다. 그런데 왜 내가 빈 화면을 볼 수 있을까? (사각형 제외).
또 다른 print() 문을 추가하려고하면 메서드 호출 순서가 변경됩니다. 질문의 과도한 길이 때문에 코드와 출력을 추가하지는 않았지만 이에 대한 설명이 있는지 알고 싶습니다.
P.S 코드를 실행하는 데 BlueJ Environment를 사용하고 있습니다.
디버거를 사용하여 코드 실행을 단계별로 시도 했습니까? –
"public void paint (Graphics g)"메서드는 이미 JFrame (java.awt.Window에 의해)에 정의되어 있으며 의도에 의해 재정의합니까? - 적어도 "setVisible (true)"호출이 "paint (Graphics g)"를 호출하기 때문에 "Draw"가 "Start"다음에 직접 인쇄되는 이유입니다. – SWoeste
@SWoeste 의도적으로 페인트를 오버라이드했습니다. 의견을 보내 주셔서 감사합니다. 퍼즐의 한 부분이 해결되었습니다. 그러나, 내가 정말로 알고 싶은 것은 draw()가 (출력이 두 번 올 것이라고 제안 된 것처럼) 어떻게 호출 할 수 있었는지입니다. –