2012-01-16 16 views
3

私はこのサイトとJavaチュートリアルで見つけることができるすべての投稿を終わりましたが、私のコードがなぜ機能していないのかまだ分かりません。他の人々のコードをコピー/ペーストしても、それはまだ動作しません。イメージはJLabelに表示されません

私はこれをテストするためのダミープログラムを作ったし、コードはそうのように見える

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.ImageIcon; 

public class gui extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        gui frame = new gui(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public gui() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 900, 700); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel lblNewLabel = new JLabel(new ImageIcon("bg.png")); 
     contentPane.add(lblNewLabel); 
    } 
} 

私が表示しようとしている背景画像、bg.pngは、プロジェクトのルートに位置していますフォルダ。私は成功してパス文字列の複数のフォーマットを試してみました。私は間違って何をしていますか?

+5

ヌルレイアウトマネージャを使用しないでください。 – mre

+0

@mreそれだけの理由はありますか?他のすべてのレイアウトはとても直感的ではありません。絶対レイアウトはGUIに物をレイアウトするのがずっと簡単です。絶対レイアウトでこの作業を行う方法はありませんか? – MattL922

+3

@ MattL922:それは理由ではありません。ヌルレイアウトマネージャを使用するのは非常に悪い習慣です。あなたのGUIは、設定の異なる別のマシンではうんざりのように見えます。レイアウトマネージャの使い方を学ぶ。見栄えのよいGUIを設計する唯一の方法です。 –

答えて

4

あなたは間違ってやっていることは、あなたがnew ImageIcon("bg.png")を呼び出すとき、あなたは現在ディレクトリからbg.pngファイルをロードしようとしていることです。現在のディレクトリは、javaが実行されるディレクトリです。現在のディレクトリはIDEからjavaを実行すると思われるディレクトリではないでしょう。

は、現在のディレクトリを表示するには、次のコードを使用します。

File dir1 = new File ("."); 
System.out.println("current directory: " + dir1.getAbsolutePath()); 

おそらくClass.getResource("/images/bg.png")を使用して、クラスパスからPNGファイルをロードする必要があります。ソースディレクトリにimagesフォルダを作成し、このディレクトリにファイルを配置します。あなたのIDEはそれを.classファイルと一緒にターゲットフォルダにコピーします。 IDEを使用していない場合は、自分でコピーする必要があります。

EDIT:詳細な調査の後

、問題の根本的な原因がnullレイアウトを使用したと思われました。しかし、現在のディレクトリからファイルをロードするのは良い考えではないので、上記のことはまだありません。

+0

実際に画像ファイルを持っているのと同じディレクトリを印刷してしまいましたが、Class.getResourceを使ってみます。 – MattL922

+3

ディレクトリが正しい場合はファイルの名前がbg.pngの場合、おそらくヌルレイアウトの使用や、画像が見えないほど小さいか透明であることが原因です。あなたのコードから 'setLayout(null)'を削除し、コンストラクタの最後に 'pack()'を呼び出します。 –

+0

私は実際に自分のコードでは問題ではなかったと思うのですが、それは私が絶対レイアウトを使用していたということだけでした。誰でも他のレイアウトを学ぶための良いリソースと、絶対的な選択が良い選択ではないことを指摘できますか? – MattL922

2

この方法を試してください: -

ImageIcon icon = createImageIcon("bg.png", "image description"); 

protected ImageIcon createImageIcon(String path, String description) { 
    java.net.URL imgURL = getClass().getResource(path); 

    if (imgURL != null) { 
     return new ImageIcon(imgURL, description); 
    } else { 
     System.err.println("Couldn't find file:" +path); 
     return null; 
    } 
} 
+0

私はこれを試しても画像はまだ表示されていません – MattL922

3

あなたは画像をファイルとして探しています。あなたが検索は、すべてあなたが

// code not tested 
System.out.println(System.getProperty("user.dir")); 

を経由して取得することができ、ユーザディレクトリへの相対パスで行われていることを行うときに、あなたはおそらくファイルとしてそれを得るためにあなたのイメージのパスを調整する必要があります。もう一つのオプションはSiva Charanが指摘したようにリソースとして取得することです。この場合、パスはクラスファイルの場所に相対的です。

ああ、あなたはレイアウトマネージャを勉強して使用し、彼らは直感的となり、作成および特にあなたのGUIのは、はるかに簡単になるmaintaing 一回。

2

gui.classファイルの横にbg.pngを置くだけです。それは、あなたがこのコードを書いた場合の情報はAccess to Resources

ここでパス=「bg.png」で見つけることができ

private ImageIcon getImage(String path) 
{ 
    URL url = getClass().getResource(path); 
    System.out.println(url); 
    if (url != null) 
     return (new ImageIcon(url)); 
    return null; 
} 

詳細を行います。またはpath = "someFolder/bg.png"よりもフォルダ内にある場合。 ですから、このような何か書くこと:

JLabel lblNewLabel = new JLabel(getImage("bg.png")); 
lblNewLabel.setBounds(30, 30, 100, 100); 

役立つかもしれない希望を。あなたはそれをデバッグすると、画像ファイルが正しくロードされているかどうかを確認する必要があるかもしれません

よろしく

0

。そして、JLabelにイメージを追加するとJLabelが拡張されないので、JLabelコンポーネントがそのサイズを取得するかどうかを確認する必要があります。

まず、イメージハンドラの幅と高さを確認してください。

関連する問題