2016-04-04 34 views
3

私の質問はJPanelに画像を表示する方法です。私がそれをどうやって行うことができるかについて、似たような質問をしている他の話題は私には分かりません。JPanelで画像を表示するには

イメージファイルProject Folder/GUI/img、具体的にはgray.pnggreen.pngをJPanelに表示するディレクトリがプロジェクトフォルダにあります。

私は他のポストで見つかったImageIconJLabelを使用して、次のコードで試してみました:

ImageIcon image = new ImageIcon("GUI/img/gray.png"); 
JLabel label = new JLabel(image); 

//JPanel panel is already initialized by the IDE 
panel.add(label) 

しかし、動作しません... JPanelは、任意の画像を表示せずに空のまま。どうやってやるの?

これに加えて、ボタンを押すなどの何らかのアクションが実行されたときに、JPanel内の画像が変更されます(:green.png)。 JPanelの画像を表示するのと同じ方法でアーカイブすることができますか?

ありがとうございます!

編集:これを取得するためのテストコードの例を示します。初期化はIDEによって自動的に行われます。

import java.awt.Image; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

public class Sample extends javax.swing.JFrame { 

    public Sample() { 
     initComponents(); 
    } 

    //Initialization 
    private void initComponents() { 

     PanelImage = new javax.swing.JPanel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addWindowListener(new java.awt.event.WindowAdapter() { 
      public void windowOpened(java.awt.event.WindowEvent evt) { 
       formWindowOpened(evt); 
      } 
     }); 

     javax.swing.GroupLayout PanelImageLayout = new javax.swing.GroupLayout(PanelImage); 
     PanelImage.setLayout(PanelImageLayout); 
     PanelImageLayout.setHorizontalGroup(
      PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 100, Short.MAX_VALUE) 
     ); 
     PanelImageLayout.setVerticalGroup(
      PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 100, Short.MAX_VALUE) 
     ); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(61, 61, 61) 
       .addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(239, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(45, 45, 45) 
       .addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(155, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }      

    private void formWindowOpened(java.awt.event.WindowEvent evt) {         
     try { 
      DisplayImage(PanelImage, "/GUI/img/gray.png"); 
     } catch (Exception ex) { 
      Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    }         

    //For display the url image in a JPanel 
    private void DisplayImage(JPanel jp, String url) throws IOException, Exception { 
     try { 
      Image image=ImageIO.read(this.getClass().getResource(url)); 
      ImageIcon imageicon=new ImageIcon(image); 
      JLabel label=new JLabel(imageicon); 
      jp.add(label); 
     } catch (IOException ex) { 
      throw new IOException(); 
     } catch (Exception ex) { 
      throw new Exception(); 
     } 
    } 

    public static void main(String args[]) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(Sample.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Sample().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration     
    private javax.swing.JPanel PanelImage;     
} 

private void DisplayImage(JPanel jp, String url)

は、私はマインスイーパの作成に取り組んでいたとき、私は同様の問題があった JPanel jp

+2

問題を再現する完全な最小例を投稿してください。 –

+3

'ImageIO.read(new File(" GUI/img/gray.png "))'を使って試してください。何らかの理由でイメージを読み込めない場合、例外がスローされます。 [イメージの読み込み/読み込み](http://docs.oracle.com/javase/tutorial/2d/images/loadimage)を参照してください。html)詳細については – MadProgrammer

+1

@JBNizet画像を含む例では、私は次のアドバイスを追加したい - 例の画像を取得する1つの方法は、[this Q&A](http:// stackoverflow)に見られる画像へのホットリンクです。 .com/q/19209650/418556)。 –

答えて

2

Googleのコードを探していたら、私は解決策になりました。以前のコメントと同じパターンを適用していました。 私のソリューションをして与えたコードは:それと

label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/gray.png")))

、私はその後、私は実装したいメソッドを作っ:

private static void DisplayImage(JPanel jp, String url) { 
    JLabel jl=new JLabel(); 
    jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(url))); 
    jp.add(jl); 
} 

多分これは完璧と最も正確ではありません解決策は、私には完璧に働く、それは私が望むものです。

ご回答いただきありがとうございます。

1

にURL String urlから、表示画像のために働くために必要なものです。私は解決策を見つけ出し、最初にImageを読み込んでから、そのImageからImageIconを作成することで作業を終了しました。あなたがイメージアイコン(。this.getClass()のgetResource( "/桂/ IMG/gray.pngを"))を使用する必要が

Image myImage = ImageIO.read(getClass().getResource("image_path.jpg")); 
    myImage = myImage.getScaledInstance(30, 30, java.awt.Image.SCALE_SMOOTH); 
    ImageIcon myImageIcon = new ImageIcon(myImage); 
+0

[Image.getScaledInstance()の危険性](https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html) – MadProgrammer

+0

アプリケーションリソースが埋め込まれますリソースを配備する際には、すぐにアクセスすることをお勧めします。 [タグ:埋め込みリソース]は、ファイルではなくURLでアクセスする必要があります。 [info。埋め込みリソースのページ](http://stackoverflow.com/tags/embedded-resource/info)を参照してください。上の(この答えに見られるように)画像をURLでロードする例です。 (その部分@ 22忍者の上でとてもうまくいく)。 –

+0

@ 22ninjas私はそのコードを何の効果もなく試しました。 'ImageIO'から' Image'オブジェクトを作成し、それを 'ImageIcon'に渡し、' JLabel'に 'JLabel'を追加し、' JPanel'に 'JLabel'を追加します。画像はパネルに表示されません。たぶん、私はその過程で間違いを犯しているのですが、その方法で実装することは私にとってはうまくいかないでしょう。 – FiroKun

1

ここにその動作例があります。

import java.awt.Dimension; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ExImage extends JPanel 
{ 

    public ExImage() 
    { 
    ImageIcon imageIcon = new ImageIcon(this.getClass().getResource("/gray.png")); 
    JLabel label = new JLabel(imageIcon); 
    add(label); 
    } 

    public static void main(String[] args) 
    { 
    JFrame frame = new JFrame(); 
    frame.add(new ExImage()); 
    frame.setVisible(true); 
    frame.setPreferredSize(new Dimension(200, 300)); 
    } 
} 
+0

私がこれを理解できるかどうかを見てみましょう。 'ExImage'は、そのコードで作成する必要があるJavaクラスであり、メインインターフェイスを持つメイン' JFrame'から、画像を表すための 'ExImage'コンストラクタを呼び出します'JFrame'の中に含まれる' JPanel'の中のURL? – FiroKun