2011-10-23 4 views
1

JFrame에 표시 할 이미지 세트가 있습니다. 그들은 모두 같은 크기입니다 - 각 이미지는 JFrame을 채 웁니다.콘텐츠 스케이프의 Java swing 스와핑 ImagePanels

f = new JFrame("xx"); 
    f.setSize(480, 854); 
    contentPane = f.getContentPane(); 
    ip1 = new ImagePanel(new File("assets/1.jpg")); 
    ip2 = new ImagePanel(new File("assets/2.jpg")); 
    ip3 = new ImagePanel(new File("assets/3.jpg")); 
    f.setVisible(true); 
    contentPane.add(ip1); 
    contentPane.addMouseListener(mouseListener); 

ImagePanel은 다음과 같습니다 : 내가 볼, 레이어 스타일 사이에 교환

public class ImagePanel extends JPanel { 
    private BufferedImage image; 

    @Override 
    public void paintComponent(Graphics g) { 
     g.drawImage(image, 0, 0, null); 
    } 

    public ImagePanel(File imageFile) { 
     try { 
      image = ImageIO.read(imageFile); 
     } catch (IOException e) { 
      System.out.println("Image could not be read: " + imageFile); 
     } 
     setVisible(true); 
    } 
} 

그리고 난의 MouseListener에 그들 사이에 교환하려고 :

static MouseListener mouseListener = new MouseListener() { 

    private int i = 1; 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // logger.log(Level.INFO, e.toString()); 
     contentPane.removeAll(); 
     if (++i > 3) i = 1; 
     switch (i) { 
      case 1: contentPane.add(ip1); break; 
      case 2: contentPane.add(ip2); break; 
      case 3: contentPane.add(ip3); break;    
     } 
     contentPane.repaint(); 
    } 
}; 

첫 번째 이미지 표시 등 원하는. 클릭하면 제게 두 번 클릭하면 흰색이되고, 세 번째로 클릭하면 원하는대로 첫 번째 이미지가 다시 표시됩니다. 흰색 클릭 사이에 프레임을 클릭하면 두 번째 및 세 번째 이미지가 나타나고 일단 렌더링되면 예상대로 작동합니다. 내가 뭘 놓치고 있니?

알아두기! 의심의 여지가 훨씬 더 좋은 방법 ... CardLayout 모두 패널을 넣어

감사

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. (내 답변은 전적으로 '스왑'이라는 단어를 기반으로했습니다.) –

+0

BTW - 'ImagePanel'에 물건 (예 : 구성 요소)을 추가 하시겠습니까? 그렇지 않다면 mKorbel이 제안한 'JLabel'이 훨씬 쉽습니다. –

+0

BufferedImages에서 ARGB를 분석 할 계획입니다 (읽기 전용). 나는 JLabel을 보았지만 각각의 BufferedImage에 도착하는 방법은 불분명했습니다. SSCCE 심판에 감사드립니다. – DJC

답변

4

가 없습니다.

+0

CardLayout을 살펴 보겠습니다. – DJC

4

  • 이 betweens 교환 할 /이 객체 (들)
이미 볼 JComponent(s)입니다 스윙 GUI를 들어, JLabelIcon

rulles 당신의 Images를 넣어

전화를 걸어야합니다.

myLabel.setIcon(myIconn); 
revalidate(); 
repaint(); 
+0

+1'JLabel', OTOH에 대한 +1 1) 다른 'Icon'을 설정 한 후에'repaint()'가 불필요합니다 2) 이미지가 다른 크기라면 코드는 revalidate()를 호출하면됩니다 반면 OP는 .. * "모두 같은 크기"*. –

+0

OP는 다른 구성 요소가 패널에 들어 가지 않음을 확인 했으므로 'JLabel'을 사용하는 것이 가장 좋은 방법이라고 생각합니다. –

+0

SetIcon은 예상대로 작동하지만 기본 래스터를 읽을 수있는 방법을 찾을 수 없습니다. 그래서 나는 아직 내가 원하는 대답을 얻지 못했다. 나는 CardLayout을 볼 것이다. – DJC