2011-10-23 9 views
1

私はJFrameに表示したい画像のセットを持っています。それらはすべて同じサイズです - 各イメージはJFrameを満たします。Java Swing ImagePanelsをContentPaneに入れてください

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(); 
    } 
}; 

最初の画像のように表示され希望。 Clickは私を白くして2回目のクリックで同じ、3回目は私の最初のイメージを望みどおりに戻します。 フレームをクリックすると、白とびの間に2番目と3番目の画像が表示され、レンダリングされると期待どおりに機能します。私は何が欠けていますか?

Ack、newbs!もっと良い方法があると間違いありません...

おかげ

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 (私の答えは「スワップ」という言葉に完全に基づいていました。) –

+0

BTW - 物件(例:コンポーネント)を 'ImagePanel'に追加しますか?もしそうでなければ、mKorbelによって提案された 'JLabel'がはるかに簡単です。 –

+0

私は、BufferedImagesのARGBの解析を計画しています(読み取り専用)。私はJLabelを見ましたが、それぞれのBufferedImageに到達する方法は不明でした。 SSCCEの参考に感謝します。 – DJC

答えて

4

CardLayoutに両方のパネルを入れてください。

+0

私はCardLayout、tyを見ます! – DJC

4

は、Swing GUI

  • のためのあなたのImages

    JLabelIconとしてrullesは、あなたがこの/これらのオブジェクト(複数可)ビトウィーンズ入れ替えたいJComponent(s)すでに目に見える
  • ある
を置きます

あなたは電話する必要があります

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

+1 'JLabel'の提案、OTOH 1)別の' Icon'を設定した後、 'repaint()'は不要です。2)イメージが異なるサイズのものであれば 'revalidate()'を呼び出すだけです一方、OPは.. * "彼らはすべて同じサイズです" *。 –

+0

OPは他のコンポーネントがパネルに入っていないことを確認していますので、「JLabelを使用するのが最良のアプローチです。 –

+0

SetIconは正常に動作しますが、基になるRasterを読み取る方法が見つけられません。だから私はまだ私が欲しい答えを持っていない。私はCardLayoutを見るだろう。 – DJC

関連する問題