2017-05-07 8 views
0

私はちょっと変わったような問題があります。新しいImageIconを追加してプログラムを実行しようとすると、灰色の画面が表示され、オブジェクトが追加されません。画像を追加するときにJFrameが機能しない

public class Ctester { 

public Ctester(){ 
    Frame(); 
} 

public void Frame(){ 

    JFrame fr = new JFrame(); 
    fr.setVisible(true); 
    fr.setSize(500, 500); 
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    fr.setResizable(false); 

    JPanel p = new JPanel(new GridBagLayout()); 
    ImageIcon icon = new ImageIcon(getClass().getResource("zippo.jpg")); 

    JLabel l = new JLabel(icon) 
    JButton bm1 = new JButton("hellu"); 

    p.add(l); 
    p.add(bm1); 
    fr.add(p); 


} 

public static void main(String[]args){ 
    new Ctester(); 
} 
} 

しかし、私は行削除する場合:

ImageIcon icon = new ImageIcon(getClass.getResource("zippo.jpg")); 

を、それが完璧に動作します。 エラーメッセージが表示されず、しばらく探していましたが、問題がgridbaglayoutで何かにしかないことがわかりました。

どうすれば解決できますか、レイアウトを変更する必要がありますか? (これはオリジナルの例に基づく単純なコードなので、レイアウトを変更する必要がないソリューションは高く評価されます)

+0

(1-) 'これは例として元のコードに基づいた単純なコードです。コードを投稿すると、コードの最小限の量でなければなりませんあなたが使用している問題を示しています。私たちはあなたが何をしているのかもしれないし、していないかもしれないと推測する時間がありません。それは適切な[mcve]を投稿したものです。 – camickr

答えて

0

このコードを試してみてください画像が見つからない場合に備えて

URL iconURL = getClass().getResource("/some/package/favicon.png"); 
// iconURL is null when not found 
ImageIcon icon = new ImageIcon(iconURL); 
fr.setIconImage(icon.getImage()); 

+0

はほとんど機能しましたが、現在はグレーですが、最小化してからもう一度取り上げると完全に機能します。だからthnxと私に新しい問題を解決しようと幸運を望む:) –

1

コードのほとんどが間違っているマルチプラットフォームになるだろうされている場合も、あなたがWindows上でのみ、このプログラムを使用している場合は.icoファイルを使用しますが、.PNGを使用します。

  1. スイングコンポーネントは、イベントディスパッチスレッド(EDT)で作成する必要があります。

  2. すべてのコンポーネントがフレームに追加された後、フレームを表示する必要があります。

  3. GridBagLayoutを使用しようとしていますが、コンポーネントを追加するときにGridBagConstraintsを使用していません。

  4. メソッド名(フレーム)は、大文字で始めるべきではありません。

スイングの基本についてはSwing Tutorialをお読みください。

あなたはの例を働いて見つけることができます:

  1. GridBagLayoutの使用方法
  2. の使い方アイコンのレイアウトを変更する必要が含まれていない任意のソリューションは非常に

    評価されそう

作業例とmakから始めてください要件に合わせて変更されます。より構造化されたコードから始めれば、問題は少なくなります。

+0

ええ、私は最後に言ったように、これは元のプログラムではない、私は元のグリッドバッグの制約を使用しています。うん、コードはmeaby少しめちゃくちゃ、私の3番目のプログラム:)しかし、ヒントのthnx私はそれが役立つ場合は試してみます。 –

1

イベントディスパッチャスレッドでGUIを起動していないため、ウィンドウのサイズ変更または最小化/最大化後に何かが正しく描画される場合は、競合状態の確実な兆候です。主な問題は、setVisible()メソッドを早期に呼び出すことです。最上位のコンテナにすべてのコンポーネントを追加するまでsetVisible()を呼び出さないでください。別の問題は、イベントディスパッチャスレッドでGUIを起動していないことです。

public class Ctester { 
    public Ctester() { 
     Frame(); 
    } 

    public void Frame() { 
     JFrame fr = new JFrame(); 
     fr.setSize(500, 500); 
     fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     fr.setResizable(false); 

     JPanel p = new JPanel(new GridBagLayout()); 

     JLabel l = new JLabel("label"); 
     JButton bm1 = new JButton("hellu"); 

     p.add(l); 
     p.add(bm1); 
     fr.add(p); 

     fr.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Ctester(); 
      } 
     }); 
    } 
} 
+0

ありがとう、最後にfr.setVisible(true)を追加して私の問題を解決しました –

+0

ええと、SwingUtilities.invokeLater()を使ってEDTであなたのGUIをキックオフする必要があります。後で潜在的な問題からあなたを救うでしょう。また、あなたの問題を解決した場合、upvoteまたは受け入れられた回答がうまくいくでしょう。 – Michael

+0

は、upv​​oteに十分な評判がない:/ –

関連する問題