2013-05-31 2 views
0

프로그램 시작시 폴더에서 읽은 이미지가 있습니다. 프로그램은 인터넷에서 새 이미지를 다운로드하고 이전 이미지, 동일한 파일 경로 및 동일한 이름을 덮어 쓰지만 표시된 이미지는 이전 이미지입니다. 프로그램을 종료하고 다시로드하면 새 이미지가 표시됩니다. 파일 경로에서 새 ImageIcon을 만들고 이미지를 다운로드 한 후에 JDialog에 표시하려고 했으므로 이미지가 변경되지 않고 여전히 오래된 이미지라는 것을 알고 있습니다. 어떤 아이디어?자바가 덮어 쓰기 된 이미지를 표시하지 않습니다.

+1

오래된 이미지가 변경되는 것을 방지 캐시에서 열리는 수와 라벨을 재 부가 ​​끝났다. 어떻게 읽습니까? 'ImageIO.read (...)'를 사용해야합니다. –

+0

당신이하고있는 것에 대한 코드 스 니펫을 추가 할 수 있다면 도움이 될 것입니다. – Shaded

+0

filePath에서 이미지를 다운로드하고 덮어 쓴 다음 JLabel myL = new ImageIcon (filePath); JDialog jd = 새 JDialog(); jd.add (myL); jdialog는 이전 이미지를 표시합니다. 프로그램을 종료하고 다시 시작하면 새 이미지가 표시됩니다. –

답변

4

그러나 올바르게 표시되는 것은 jdialog뿐입니다. 원래 프레임은 여전히 ​​frame.validate()를 호출했지만 이전 이미지를 보여줍니다. frame.repaint();

이미지를 메모리로 읽어도 구성 요소가 새 이미지를 참조하지 않습니다. 이전 이미지를 사용하는 구성 요소에 아이콘을 추가해야합니다.

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import java.util.*; 
import javax.imageio.*; 
import javax.swing.*; 
import java.net.*; 

public class ImageReload extends JFrame implements ActionListener 
{ 
    JLabel timeLabel; 
    JLabel imageLabel; 
    ImageIcon icon = new ImageIcon("timeLabel.jpg"); 

    public ImageReload() 
    { 
     timeLabel = new JLabel(new Date().toString()); 
     imageLabel = new JLabel(timeLabel.getText()); 
     getContentPane().add(timeLabel, BorderLayout.NORTH); 
     getContentPane().add(imageLabel, BorderLayout.SOUTH); 

     javax.swing.Timer timer = new javax.swing.Timer(1000, this); 
     timer.start(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     timeLabel.setText(new Date().toString()); 

     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        String imageName = "timeLabel.jpg"; 
        BufferedImage image = ScreenImage.createImage(timeLabel); 
        ScreenImage.writeImage(image, imageName); 

        // This works using ImageIO 

//     imageLabel.setIcon(new ImageIcon(ImageIO.read(new File(imageName)))); 

        // Or you can flush the image 

        ImageIcon icon = new ImageIcon(imageName); 
        icon.getImage().flush(); 
        imageLabel.setIcon(icon); 
       } 
       catch(Exception e) 
       { 
        System.out.println(e); 
       } 
      } 
     }); 
    } 

    public static void main(String[] args) 
    { 
     ImageReload frame = new ImageReload(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

오 ...에 대한 참조를 가지고 있을지도 모른다. 나는 단지 프레임에서 구성 요소를 지우고 새로운 jlabel lol로 그것을 읽음으로써 끝냈다. –

+0

그리고 나 자신의 질문에 대한 답변으로 스스로 게시하고 그것은 당신의 대답으로, 또는 만족스러운 대답으로 이것을 체크하십시오. – JoshDM

+0

@ALee, '방금 프레임에서 구성 요소를 삭제하고 새로운 jlabel로 읽습니다.'- 왜? 방금 아이콘을 대체하는 방법을 보여 줬어. – camickr

-1

프레임에서 이전 구성 요소를 삭제하고, 새로운 이미지

frame.remove(picLabel); 
BufferedImage b = ImageIO.read(new File(attemptedFilePath)); 
picLabel = new JLabel(new ImageIcon(b)); 
GridBagConstraints c = new GridBagConstraints(); 
c.weightx = 0.5; 
c.anchor = GridBagConstraints.FIRST_LINE_START; 
c.gridx = 0; 
c.gridy = 0; 
c.fill = GridBagConstraints.NONE; 
c.insets = new Insets(10,10,0,0); 
c.gridwidth = 15; 
c.gridheight = 15; 
frame.getContentPane().add(picLabel, c); 
+0

-1, 항상 구성 요소의 속성을 수정하는 것이 더 쉽습니다. 구성 요소를 다시 만들고 GUI에 다시 구성 요소를 추가하는 것이 더 쉽습니다. 보이는 GUI에서 컴포넌트를 추가/제거 할 때마다 부모 컨테이너를 다시 검증()/다시 칠해야합니다. 또한 제약 조건을 설정할 수 있도록 어떤 레이아웃 관리자가 사용되고 있는지 알아야합니다. 또한 여러 구성 요소가있는 경우 component.component를 추가 할 위치를 알아야하기 때문에이 기능이 제대로 작동하지 않습니다. – camickr

관련 문제