2013-08-18 2 views
1

ImagePanel을 작성하여 지정한 디렉토리에서 이미지를 표시 할 수 있습니다. -> 1 초간 대기하고 java 프로젝트 디렉토리에서 다음 이미지를로드합니다. 실제로 다음 이미지를로드하지만 표시되지 않습니다 (패널을 새로 고치지 않음). 디렉토리의 모든 파일을 완료하면 디렉토리의 마지막 이미지 만 표시됩니다. 모든 이미지를로드 한 후 새로 고침하고 싶습니다.다음 이미지를로드 한 후 JPanel을 새로 고침

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.border.LineBorder; 

public class Okno extends JFrame { 
    JPanel jp; 
    ImagePanel ImagePanel; 
    JButton buttonExit; 
    JButton buttonWyjscie; 

    public Okno() { 

    } 

    public void createGUI() { 
     setSize(400, 400); 
     setLayout(new GridLayout()); 
     buttonExit = new JButton("Exit"); 
     buttonWyjscie = new JButton("Wyjscie"); 
     // Sluchacz sluchacz = new Sluchacz(); 

     // buttonExit.addActionListener(sluchacz); 
     buttonExit.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 

      } 
     }); 

     jp = new JPanel(); 
     jp.setBorder(new LineBorder(new Color(40, 120, 80), 4)); 

     ImagePanel = new ImagePanel(); 
     ImagePanel.setBorder(new LineBorder(Color.blue, 4)); 
     jp.add(buttonExit); 
     add(jp); 
     add(ImagePanel); 

     setVisible(true); 
     slajd(); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 

    public void slajd() { 
     try { 
      File f = new File("."); 
      File[] tablicaPlikow = f.listFiles(); 
      for (File el : tablicaPlikow) { 

       String rozszerzenie = el.getName().substring(
         el.getName().length() - 3); 

       if (rozszerzenie.equals("jpg") || rozszerzenie.equals("peg")) { 
        System.out.println(rozszerzenie); 
        ImagePanel.setImage(el); 
       } 
       repaint(); 
      } 
      setVisible(true); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Okno().createGUI(); 
      } 
     }); 

    } 

} 

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel { 
    private BufferedImage image; 

    public ImagePanel() { 
    } 

    public ImagePanel(String sciezka) { 
     setImage(new File(sciezka)); 
    } 

    public void setImage(File plik) { 
     try { 
      image = ImageIO.read(plik); 
      System.out.println("tutaj"); 
      repaint(); 
      Thread.sleep(1000); 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 

    public void paint(Graphics g) { 
     if (image != null) { 
      Image b = image.getScaledInstance(getWidth(), getHeight(), 
        Image.SCALE_FAST); 
      g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
     } 

    } 

} 
+0

귀하의 시도는 무엇입니까? 왜 그들은 일하지 않았습니까? 어떤면에서 그들이 기대 한 바를 성취하지 못했습니까? 오류 메시지, 예외 또는 원하지 않는 동작? –

답변

3

가에서 잠자는 읽기 EDT은 스윙이 그림을 수행하는 것을 방지하므로 마지막 이미지 만 볼 수 있습니다. 대신 이벤트 발송 쓰레드에서 자고의 반복 작업을 수행하는 스윙 Timer를 사용 이미지를로드하는 시간이 오래 걸리는 경우

private final ActionListener timerTask = new ActionListener() { 
    @Override 
    public void actionPerformed(final ActionEvent e) { 
     // Whatever you need to to that 
     showNextImage(); 
    } 
}; 

Timer timer = new Timer(1000, timerTask); 
timer.start(); 

을, 동부 서머 타임을 차단하지 않고, 메모리에서 다음 중 하나를 사전로드에 대한 background task 사용을 고려 .

2

짧은 대답이 될 수있다 : 방법 slajd에, repaint();에 전화 후, 그러나

Thread.sleep(1000); 

를 추가, 이것은 스윙의 이벤트 기반 특성에 완전히 반대되는 ,이 특수한 경우에는 효율적인 이유로 Swing이 즉시 repaint() 호출을 실행하지 않기 때문에 작동하지 않습니다. 모든 이벤트 처리가 끝나면 한 번만 "수집하여 실행합니다. 이벤트 처리기 (직접 또는 간접적으로)에 휴면 기간 (또는 다른 장기 실행 작업)을 포함 시키면 다시 칠하기가 지연되고 응용 프로그램이이 경우와 같이 실제로 작동하지 않는 지점에 상당히 반응하지 않습니다. 대신 slajd()를 호출의 1 초마다 발사가 (몇 가지 다른 패키지 java.util.Timer, 또는 Timer 클래스와 혼동하지 javax.swing.Timer) createGUI는 스윙 타이머를 인스턴스화 당신이해야 할 일은

이다. 첫 번째 실행은 즉시 이루어 지거나 첫 번째 파일을 표시하는 코드를 포함 할 수 있습니다. 연관된 청취자는 slajd()을 대체하여 표시 할 다음 파일을 추적해야합니다. 당신은 아마 자세한 내용 등

이 추적 파일을 표시 할 ImagePanel에 대한 포인터를 지원하기 위해이 청취자에게 필드 본격적인 클래스를 확인하는 것이 좋습니다, Java's Tutorial on How to Use Swing Timers

+0

1) 질문이 모두 문제라면 작동 할 것이므로 (아마도 사용하게 될 것입니다.) 2) 나는 집에서 너무 많은 흑인을 가지고 있었고 나의 반응을 구하고 싶어했기 때문에. 그 후 몇 가지 다른 부분 저장도했는데 3) 내 대답 (원하는 경우 확인하십시오)은 일반적으로 길고 (잘하면) 완료되지만 일부 응답자는 빠른 응답 만 원하기 때문입니다. –

+0

아닙니다. 위의 3)과 일관되게 Thread.sleep이 실제로 작동하지 않는 이유를 설명 할 것입니다. 이 답변을 더 잘 작성해 주셔서 감사합니다. –

관련 문제