2014-10-06 4 views
1

그래서 Canvas를 확장 한 MainClass라는 클래스가 있습니다. 페인트 방법을 재정의하지 않고 채워진 사각형을 캔버스에 그려 보려고합니다. 그것을 할 수있는 방법이 있습니까 아니면 내가 페인트 방법을 재정의해야하고 거기에 그려 싶어요?JAVA - 확장 캔버스에서 그림 그리기

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 


public class MainClass extends Canvas { 
    MainClass() 
    { 
     JFrame MainWindow = new JFrame("Main Window"); 
     MainWindow.setVisible(true); 
     MainWindow.setSize(500, 500); 
     MainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     MainWindow.add(this); 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
    } 

    public static void main(String[] args) 
    { 
     MainClass temp = new MainClass(); 

     Graphics g = (Graphics2D)temp.getGraphics(); 
     g.setColor(Color.red); 
     g.fillRect(0, 0, 400, 400); 
     temp.repaint(); 
    } 
} 

아이디어는이 클래스가 있고 캔버스의 그래픽 개체를 가져 와서 직접 그릴 수 있습니다. 아니면 내게 어떤 위치에서 그림을 그리는 방법으로 도형과 물건을 전달할 생각이었습니다.

+2

* "그 방법이 있습니까? 아니면 페인트 방법을 무시하고 그 위에 그려야합니다?"* 짧은 대답은 no입니다. – MadProgrammer

+0

더 긴 대답은 [ 'BufferStrategy'] (http://docs.oracle.com/javase/tutorial/extra/fullscreen/bufferstrategy.html)에 설명되어 있지만 복잡한 작업을 추가하는 페인팅 프로세스를 제어해야합니다. ... – MadProgrammer

답변

4
  1. 캔버스를 사용하지 마십시오.
  2. 대신
  3. 인 JPanel을 확장하고 JPanel의의의 paintComponent 방법이 아닌 paint 메소드 오버라이드 (그리고 왜 메소드를 오버라이드 (override)하지? 회화로 이의 그 안에 무엇?).
  4. 구글은 자바 스윙 페인팅 자습서를 통해 그들을 통과합니다. Here's the link.
  5. 구성 요소에 getGraphics()을 호출하면 해당 시점에 올바르게 작동 할 수있는 수명이 짧은 그래픽 컨텍스트를 얻게되지만, 다시 그리기가 발생하면 작동하지 않으며 (사용자가 제어 할 수없는 경우) 프로그램 그래픽 오류 또는 NullPointerException. 절박한 필요를 느끼지 않고 자신이하는 일을 알지 않는 한이 일을 피해야합니다. "당신이하고있는 일을 알기"위해 Haase and Guy가 저술 한 책 Filthy Rich Clients을 읽으십시오.
  6. 이미지에서 파생 된 Graphics 객체를 사용하여 항상 BufferedImage에서 직접 그릴 수는 있지만 paintComponent(...) 메소드 오버라이드에서 BufferedImage를 그려야합니다.
+0

나는 캔버스를 확장하는 코드의 골격을 숙제로하고 있습니다. 내가 페인트 메서드 밖에 그것을 원하는 이유는 다른 메서드가 대신 호출 될 때 특정 메서드가 호출 될 때 동그라미를 그려 보거나 직사각형을 말하고 싶기 때문입니다. 미친 깃발과 페인트 칠을하고 깃발에서 무엇을 가져올 지 페인트 방법을 선택하게하고 싶지 않습니다. – user3689034

+0

@ user3689034 : 스윙 그래픽은 수동이기 때문에 가장 좋은 옵션은 페인트 방법이나 BufferedImage (그리기 방법으로 여전히 그려 짐)에 그려야한다는 것입니다. 'ArrayList '에서 도형을 추가하거나 제거 할 수 있으며 그리기 메소드의 목록을 반복 할 수 있습니다. 여기에는 많은 옵션이 있습니다. –