2016-12-22 6 views
0

EDIT : 첫 번째 질문이 풀리고 Roberto Attias 's answer을 참조하고 댓글을 읽을 수 있습니다. 아직도 두 번째 문제가 있습니다.AWT를 사용하여 자바에서 이미지 그리기

Java에서 작은 2D 게임을해야하며 AWT를 가능한 한 많이 사용하고 싶습니다. (꼭 필요한 경우가 아니면 SWING도 Java2D도 필요하지 않습니다.)

나는 창을 가지고 있으며 그 위에 이미지를 그릴 수 있지만 두 가지 문제가 있습니다. 먼저 두 개 이상의 이미지를 그릴 수 없습니다. 사실 디버그시에 내 테스트 중 일부는 내 프로그램이 내 두 이미지를 삭제하고 첫 이미지 만 다시 그려야한다는 것을 알 수 있습니다. 열린

public class AwtManager { 
    private Frame frame; 
    private Panel panel; 
    public AwtManager(){ 
     frame = new Frame("a"); 
     frame.setSize(800,600); 
     frame.setLocation(100, 100); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEnvent){ 
       System.exit(0); 
      } 
     }); 

    panel = new Panel(); 
    // here I tried to setBounds to solve my second issue, it didn't work 
    //panel.setBounds(0, 0, 800, 600); 
    frame.add(panel); 
    frame.setVisible(true); 
    } 

이 부분 : 둘째, 다시 그려진다 첫 번째 이미지는 내가 그런 일을 지금은 (는 약간 왼쪽 아래에)

가해야 좌표에 있지 내 창문과 작품 꽤 멋지지만 내 두 번째 문제는 내 프레임/패널의 경계에 의해 발생하는 것 같습니다 그래서 여기에 할 몇 changement있을 수 있습니다.

public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
     for (int i = 0; i < images.size(); i++) { 
      panel.add(images.get(i); 
      //And this is where I'm lost 

     } 
     // or here maybe 
     frame.setVisible(true); 
    } 
} 

이 두 번째 부분에서 나는 Component.paint (g), Component.update (g)의 모든 조합을 시도 Component.repaint(), Component.setVisible (참) 내가 생각할 수있다.

내 객체 ImageComponent은 단순히 이것이다 :

public class ImageComponent extends Component { 
    private static final long serialVersionUID = 1L; 
    private BufferedImage img; 
    private int x; 
    private int y; 

    public ImageComponent(String path,int x, int y){ 
     try{ 
      img = ImageIO.read(new File(path)); 
      this.x = x; 
      this.y = y; 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

이 함수는 getPreferredSize() 지옥 같은 날 방해, 그것은 ImageComponent의 추천 사이즈를 반환해야하지만 분명히 내 프레임/패널의 크기를 넣어야 할 그렇지 않으면 작동하지 않습니다.

public Dimension getPreferredSize(){ 
     return new Dimension(800,600); 
    } 

그리고 마지막으로 내 페인트, 업데이트 칠은 :

public void paint(Graphics g){ 
     g.drawImage(img, x, y,null);  
    } 

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

    public void repaint(){ 
     this.getGraphics().drawImage(img, x, y, null); 
    } 
} 

내가보기 엔 그들이하지만 매우 어려운 주제에 문서를 찾을해야하는지 등 그 세 모습 이해하는 의심.

그래서, 그 문제를 도와 주시겠습니까 방법에 의해 당신은 Component.setVisible (부울) 어떻게 작동하는지 알고 싶습니다 디버그 모드에서,이 함수는 날 느슨한 일부 머리카락을 만들었 기 때문에 알고 싶습니다.

편집 :

여기

내가 두 개의 빨간색 사각형을 요구 것을 알고 내 방 창문의 스크린 샷입니다 (이 있습니다 이미지를하지 사각형), 하나 0,0, (200)에서 다른, 200

Result of my program

편집 2 : 다음은 완벽하게 실행 가능한 코드 (내 생각)입니다 :

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

public class AwtManager { 
    private Frame frame; 
    private Panel panel; 

    public static void main(String args[]) { 
     new AwtManager(); 
     ArrayList<ImageComponent> images = new ArrayList<>(); 
     images.add(new ImageComponent("myimage.jpg", 0, 0)); 
     images.add(new ImageComponent("myimage.jpg", 200, 200)); 
     showMytwoImagesFFS(images); 
    } 


    public AwtManager(){ 
     frame = new Frame("a"); 
     frame.setSize(800,600); 
     frame.setLocation(100, 100); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEnvent){ 
       System.exit(0); 
      } 
     }); 

     panel = new Panel(); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 

    public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
     for (int i = 0; i < images.size(); i++) { 
      panel.add(images.get(i)); 
     } 
     frame.setVisible(true); 
    } 
} 

import java.io.*; 
import java.awt.*; 
import java.awt.image.*; 
import javax.imageio.ImageIO; 
public class ImageComponent extends Component { 
    private static final long serialVersionUID = 1L; 
    private BufferedImage img; 
    private int x; 
    private int y; 

    public ImageComponent(String path,int x, int y){ 
     try{ 
      img = ImageIO.read(new File(path)); 
      this.x = x; 
      this.y = y; 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(800,600); 
    } 

    public void paint(Graphics g){ 
     g.drawImage(img, x, y,null);  
    } 

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

    public void repaint(){ 
     this.getGraphics().drawImage(img, x, y, null); 
    } 
} 
+0

"첫 번째 질문이 해결되었습니다." 당신은 모든 존경심을 가지고 패자입니다. – gpasch

+0

죄송합니다, 제가 요점을 줄 수 있다는 것을 잊어 버렸습니다. 슬프게도 제가 줄 수없는 "받아 들인 응답"에 초점을 맞추 었습니다. 여전히 문제가 있음을 알고 있습니다. 어쨌든, 당신은 내가 SO (그 신성한 포인트 중 단지 11 개)에 대한 질문을하는 것이 아주 새로운 것으로 나타났습니다. 그리고 "패배자"라고 부르지 않았습니다. – Krowk

+0

명백하게 나는 지적 할 수 없다. 나는 그 중 15 명을 먼저 필요로한다. 어떻게해야 하는가? – Krowk

답변

0

그냥 빨리 생각,하지만 당신은 VISI를 알고 해당 ArrayList에있는 각 이미지의 bility? 나는.

public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
    for (int i = 0; i < images.size(); i++) { 
     images.get(i).setVisible(true);//is the visibility actually true? 
     panel.add(images.get(i); 

    } 
    // or here maybe 
    frame.setVisible(true); 
} 

또한 프로그램보기에 대한 스크린 샷이 있습니까? GUI 문제로 인해 진행 상황을 볼 수 있다면 해결하기가 더 쉽습니다.

+0

방금 ​​살펴 봤는데 물어 보면 : images.get (i) .isVisible(); 두 이미지 모두에 대해 사실을 알 수 있습니다. 몇 초 후에 스크린 샷을 추가하겠습니다. – Krowk

0

이것은 실행하기 위해 약간 수정 된 코드입니다. 앞으로는 실행 가능한 예제를 게시하십시오.

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

public class AwtManager { 
    private Frame frame; 
    private Panel panel; 

    public static void main(String args[]) { 
     new AwtManager(); 
    } 


    public AwtManager(){ 
     frame = new Frame("a"); 
     frame.setSize(800,600); 
     frame.setLocation(100, 100); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEnvent){ 
       System.exit(0); 
      } 
     }); 

    panel = new Panel(); 
    // here I tried to setBounds to solve my second issue, it didn't work 
    //panel.setBounds(0, 0, 800, 600); 
    frame.add(panel); 
    ArrayList<ImageComponent> images = new ArrayList<>(); 
    images.add(new ImageComponent("myimage.jpg", 0, 0)); 
    showMytwoImagesFFS(images); 
    frame.setVisible(true); 
    } 

    public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
     for (int i = 0; i < images.size(); i++) { 
      panel.add(images.get(i)); 
     } 
    } 
} 

import java.io.*; 
import java.awt.*; 
import java.awt.image.*; 
import javax.imageio.ImageIO; 

public class ImageComponent extends Component { 
    private static final long serialVersionUID = 1L; 
    private BufferedImage img; 
    private int x; 
    private int y; 

    public ImageComponent(String path,int x, int y){ 
     try{ 
      img = ImageIO.read(new File(path)); 
      this.x = x; 
      this.y = y; 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(800,600); 
    } 
    public void paint(Graphics g){ 
     g.drawImage(img, x, y,null); 
    } 

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

    public void repaint(){ 
     this.getGraphics().drawImage(img, x, y, null); 
    } 
} 
+0

죄송합니다. 문제가 될 것이라고 생각하지 않았습니다. 질문에 완전히 실행 가능한 코드를 추가하겠습니다. 귀하의 버전에서는 첫 번째 frame.setVisible() 전에 생성자에서 showMyTwoImagesFFS (ArrayList )를 호출합니다.이 경우에는 작동하지만 몇 초 후에 이미지가 튀어 나오지 않게하려면 그? – Krowk

+0

언제 추가 할 것인지 잘 모르겠습니다. 대부분의 경우 UI는 초기화시 레이아웃됩니다. 시각화 후에 UI 외관 (구성 요소 추가/제거, 레이아웃 관리자 변경 등)을 수정해야하는 경우'revalidate() '를 호출해야 할 수도 있습니다. –

+0

오, 몰랐습니다. 마음에서 – Krowk