2012-04-07 15 views
3

現在作業がうまくいかないアプリケーションの部分は、一度に1つずつ画像のリストをスクロールして表示できます。ユーザーからディレクトリを取得し、そのディレクトリのすべてのファイルをスプールして、jpegとpngだけの配列をロードしています。次に、最初の画像でJLabelを更新し、前後のボタンをスクロールして各画像を順番に表示したいとします。私は第2の画像を表示しようとすると、それは更新されません...ここで私はこれまで持っているものです:JLabelに含まれている画像の更新 - problems

public class CreateGallery 
{ 
    private JLabel swingImage; 

私は画像を更新するために使用しています方法:

protected void updateImage(String name) 
{ 
    BufferedImage image = null; 
    Image scaledImage = null; 
    JLabel tempImage; 

    try 
    { 
     image = ImageIO.read(new File(name)); 
    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    // getScaledImage returns an Image that's been resized proportionally to my thumbnail constraints 
    scaledImage = getScaledImage(image, THUMB_SIZE_X, THUMB_SIZE_Y); 
    tempImage = new JLabel(new ImageIcon(scaledImage)); 
    swingImage = tempImage; 
} 
あなたがここまで得ている場合は、最初の画像は私のdefault.jです...

private void createAndShowGUI() 
{ 
    //Create and set up the window. 
    final JFrame frame = new JFrame(); 

    // Miscellaneous code in here - removed for brevity 

    // Create the Image Thumbnail swingImage and start up with a default image 
    swingImage = new JLabel(); 
    String rootPath = new java.io.File("").getAbsolutePath(); 
    updateImage(rootPath + "/images/default.jpg"); 

    // Miscellaneous code in here - removed for brevity 

    rightPane.add(swingImage, BorderLayout.PAGE_START); 
    frame.add(rightPane, BorderLayout.LINE_END); 
public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      UIManager.put("swing.boldMetal", Boolean.FALSE); 
      new CreateGalleryXML().createAndShowGUI(); 
     } 
    }); 
} 

にswingImageを置く私のcreateAndShowGUI方法で次に

pg、そして一度私はディレクトリを取得し、そのディレクトリ内の最初のイメージを特定します。これは、swingImageを更新しようとすると失敗する場所です。さて、私はswingImage.setVisible()とswingImage.revalidate()を強制的に再読み込みしようとしました。私はそれが私のtempImage =根本的な新しいJLabelだと思っています。しかし、swingImageをただ更新するためにBufferedImageまたはImageをJLabelに変換する方法がわかりません。

+0

私はあなたの 'setVisible()/ revalidate()'呼び出しがこのような状況ではうまくいかなかった理由に関する少しの情報を追加しました。うまくいけば、この予期しない振る舞いを得ている理由について、もう少し詳しく説明しておきたいと思います。 –

+0

swingImage = tempImageの後にtrueに設定する前にsetVisible(false)のさまざまな組み合わせを試しました。 setVisible(true)の前後に.revalidate()を使って試してみました。しかし、私はそれが問題を引き起こしている新しいImageIcon(scaledImage)だと信じ始めています...まだそれを見て、それを理解しようとしています.... – Osh

答えて

8

代わりに単に画像を変更するJLabelJLabel#setIcon(...)方法を使用し、各ImageためJLabelNew Instanceを作成します。

小さなサンプルプログラム:

:あなたはImageIOででそれをやって以来

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SlideShow extends JPanel 
{ 
    private int i = 0; 
    private Timer timer; 
    private JLabel images = new JLabel(); 
    private Icon[] icons = {UIManager.getIcon("OptionPane.informationIcon"), 
          UIManager.getIcon("OptionPane.errorIcon"), 
          UIManager.getIcon("OptionPane.warningIcon")}; 
    private ImageIcon pictures1, pictures2, pictures3, pictures4; 
    private ActionListener action = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     {      
      i++; 
      System.out.println(i); 

      if(i == 1) 
      { 
       pictures1 = new ImageIcon("image/caIcon.png"); 
       images.setIcon(icons[i - 1]); 
       System.out.println("picture 1 should be displayed here"); 
      } 
      if(i == 2) 
      { 
       pictures2 = new ImageIcon("image/Keyboard.png"); 
       images.setIcon(icons[i - 1]); 
       System.out.println("picture 2 should be displayed here"); 
      } 
      if(i == 3) 
      { 
       pictures3 = new ImageIcon("image/ukIcon.png"); 
       images.setIcon(icons[i - 1]); 
       System.out.println("picture 3 should be displayed here"); 
      } 
      if(i == 4) 
      { 
       pictures4 = new ImageIcon("image/Mouse.png"); 
       images.setIcon(icons[0]); 
       System.out.println("picture 4 should be displayed here"); 
      } 
      if(i == 5) 
      { 
       timer.stop(); 
       System.exit(0); 
      } 
      revalidate(); 
      repaint(); 
     } 
    }; 

    public SlideShow() 
    { 
     JFrame frame = new JFrame("SLIDE SHOW"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 

     frame.getContentPane().add(this); 

     add(images); 

     frame.setSize(300, 300); 
     frame.setVisible(true); 
     timer = new Timer(2000, action);  
     timer.start(); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new SlideShow(); 
      } 
     }); 
    } 
} 

は、ここで何が起こっているかのようにあなたのケースに関連することJLabel using ImageIO

情報に関連した良い例です。

createAndShowGUI()メソッドの中でJLabel(swingImage)を初期化し、JPanelに間接的にJFrameを追加しました。

しかし、今、あなたのupdateImage()メソッドの内部では、新しいJLabelを初期化され、今ではtempImage = new JLabel(new ImageIcon(scaledImage));を書き込み、この後、あなたがこの新しくJLabel作成を指すようにswingImage(JLabel)を指しているが、これは新たに作成されたことで、いくつかの他のメモリ位置に常駐JLabelいつでもJPanelに追加されたことはありません。したがって、あなたがrevalidate()/repaint()/setVisible(...)を試しても、それは見えません。したがって、あなたはこれをあなたのupdateImage(...)メソッドのコード変更のいずれか:

protected void updateImage(String name) 
{ 
    BufferedImage image = null; 
    Image scaledImage = null; 
    JLabel tempImage; 

    try 
    { 
     image = ImageIO.read(new File(name)); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    // getScaledImage returns an Image that's been resized 
    // proportionally to my thumbnail constraints 
    scaledImage = getScaledImage(image, THUMB_SIZE_X, THUMB_SIZE_Y); 
    tempImage = new JLabel(new ImageIcon(scaledImage)); 
    rightPane.remove(swingImage); 
    swingImage = tempImage; 
    rightPane.add(swingImage, BorderLayout.PAGE_START); 
    rightPane.revalidate(); 
    rightPane.repaint(); // required sometimes 
} 

もないと先に述べたように

ここ

がどのようにNew JLabel見ANSWERを更新しました:-) JLabel.setIcon(...)を使用します

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SlideShow extends JPanel 
{ 
    private int i = 0; 
    private Timer timer; 
    private JLabel images = new JLabel(); 
    private Icon[] icons = {UIManager.getIcon("OptionPane.informationIcon"), 
          UIManager.getIcon("OptionPane.errorIcon"), 
          UIManager.getIcon("OptionPane.warningIcon")}; 
    private ActionListener action = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     {      
      i++; 
      System.out.println(i);   

      if(i == 4) 
      { 
       timer.stop(); 
       System.exit(0); 
      } 
      remove(images); 
      JLabel temp = new JLabel(icons[i - 1]); 
      images = temp; 
      add(images); 
      revalidate(); 
      repaint(); 
     } 
    }; 

    private void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("SLIDE SHOW"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true);  

     this.setLayout(new FlowLayout(FlowLayout.LEFT));  

     add(images); 

     frame.getContentPane().add(this, BorderLayout.CENTER); 

     frame.setSize(300, 300); 
     frame.setVisible(true); 
     timer = new Timer(2000, action);  
     timer.start(); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new SlideShow().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 
01の位置に配置されています

質問:私が試した2つのオプションのうち、もう1つは他のものより優れていますか?

setIcon(...)は、意味では、JLabelの追加/削除後にrevalidate()/ repaint()thingyについて気にする必要はありません。さらに、毎回JLabelの配置を覚えておく必要はありません。それはその位置にとどまり、文字列を付けずに作業を完了し、頭痛のない画像を変更するためのメソッドを呼び出します。

質問2:Array of Recordsとは何か疑問がありましたか?

+4

良いアプローチは、ここ[http] //sites.google.com/site/drjohnbmatthews/googleolympiad) – trashgod

+0

ありがとうございました:-)、あなたはあらゆる状況の例を持っていましたが、今日は疑いの余地はありません:-) –

+0

ありがとうございました!あなたのswingImage.setIcon(アイコン)ソリューションがうまくいきました...あなたの改良されたupdateImageメソッドを見て、それがどのように動作するかを見て、@ trashgodのリンクも見てみたいと思います。もう一度、皆さんが私を助けてくれました! – Osh

関連する問題