2014-01-20 7 views
1

새로운 페인트 디렉토리로 페인트 디렉토리를 보내고 그 이미지로 이미지 변수를 변경하여 페인트되는 이미지를 변경하려고합니다. 나는 디렉토리가 통과하고 있지만 이미지가 결코 바뀌지 않도록 코드를 테스트했다. 그들은 단지 새로운 이미지를 무시하고 이전 이미지를 유지하는 것처럼 보입니다. 지저분한 코드에 대해 사과하지만 시간이 지나면 이미지가 변경되고 좌절감이 생겨나 고 있습니다.페인트 패널의 페인트 된 이미지 변경하기

public class painting extends JPanel { 
    private String BGDir; 
    private String Dir; 
    private int Width; 
    private int Height; 
    private Image image1; 
    private Image image2; 

    public painting(int h, int w, String BG, String Char) { 
     BGDir = BG; 
     Dir = Char; 
     Height = h; 
     Width = w; 
     System.out.println(BGDir); 
     System.out.println(Dir); 
     try { 
      image1 = (new ImageIcon(Char)).getImage(); 
      image2 = (new ImageIcon(BG)).getImage(); 
     } catch (Exception e) { 
      System.out.println("no such file"); 
     } 
     repaint(); 
    } 

    public void update(Graphics g) { 
     paintComponent(g); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     System.out.println(BGDir); 
     System.out.println(Dir); 
     // PAINTS THE BACKGROUND 
     g2.drawImage(image2, 0, 0, getWidth(), (int) (getWidth() * .533), null); 
     // PAINTS THE SCALED CHARACTER 
     g2.drawImage(image1, (int) (Width/6.22), (int) (Height * .246), 
       (int) (Height * .754 * .2376), (int) (Height * .754), null); 
     repaint(); 

    } 
} 
+0

코드는 상단의 텍스트 단락에 걸린 것처럼 보입니다! 전체 클래스를 읽을 수 있도록 편집하는 것이 좋습니다. 이미지가 업데이트 될 때마다 레코드에 대해'repaint()'를 호출해야합니다. 이 클래스 외부의 이미지를 업데이트하는 경우 새 이미지가 설정된 후에 repaint()를 호출해야합니다. – Gorbles

+0

나는 그 감사를 시도 할 것이다. 코드를 읽을 수있게 편집했습니다. 미안합니다. 저는 실제로 생성자를 통해 페인팅 클래스에 새 이미지 데이터를 보내고 시도했을 때 작동하지 않는 것처럼 내부적으로 이미지를 업데이트하려고합니다. 외부로 수행하기 – JoeyTheAsian

+0

문제는 생성자를 통해 데이터를 보낼 때마다 그림의 새 인스턴스를 만들고 그 인스턴스가 JFrame에 추가되지 않아 표시되지 않는다는 것입니다. 그것을 고칠 방법이 있습니까? JPanel을 제거하고 새로운 것을 추가 한 다음 다시 칠해 보았지만 작동하지 않는 것 같았습니다 – JoeyTheAsian

답변

0

나는 BufferedImage을 사용합니다. 그러나 이것은 제가 가지고있는 작업 코드의 샘플입니다.

public class PaintPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 

    BufferedImage icon; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(getBufferedIcon(), 12, 12, null); 
    } 

    public void setBufferedIcon(BufferedImage icon) { 
     this.icon = icon; 
    } 

    private BufferedImage getBufferedIcon() { 
     return icon; 
    } 
} 

오프셋 12는 무시합니다. 이는 제가이 프로젝트에서 찢어 졌기 때문입니다. 다른 클래스에서 내가하는 일은 PaintPanel을 만들고 BufferedIcon을 설정하는 것입니다.

내가 아이콘을 업데이트 할 때마다, 나는 PaintPanel.setBufferedIcon(icon); 전화 후 PaintPanel.repaint();

이름PaintPanel에 기억, 난 그냥 그래서 당신은 코드를 더 쉽게 읽을 수를 호출하고 있습니다 :

+0

이 방법은 완전히 새로운 JPanel을 만들 수있는 복잡한 코드보다 훨씬 깨끗합니다. 감사합니다. 나는 이것을 시도 할 것이다. – JoeyTheAsian

0

이 패널을 한 번 인스턴스화 한 후에는 생성자 매개 변수를 통해 이미지를 변경할 수 없습니다. 이 패널의 새 인스턴스는 새 URL을 사용하여 만 만들 수 있고 이후에는 이전 인스턴스를 새 인스턴스로 바꿀 수 있습니다. 이 창의 첫 번째 인스턴스를 만드는 위치의 코드와 이미지 업데이트 방법을 나타내는 코드를 표시해야합니다.

+0

새로운 JPanel을 만들고 JFrame에 추가하여 이미지가 업데이트되는 방식으로 작동하도록했습니다. 유일한 문제는 내 UI 위에 표시되고 사용자가 더 이상 프로그램과 상호 작용할 수 없다는 것입니다. JPanel을 항상 맨 위에 표시 할 수있는 방법이 있습니까? – JoeyTheAsian