2011-07-18 13 views
2

これは私の最初の質問です。Netbeans 7.0のJFrameにバックグラウンドイメージを追加する際のトラブル

私はすでに完全に設計されたアプリケーションを開発中です。今私はコーディングの段階にあり、JFrameに背景画像を配置しながらコンテナとしての役割を果たすことができないため、ボタンやその性質のものを置くことができません。

NetBeans 7.0でこのJFrameクラスファイルを作成しました。誰かがNetbeansのインターフェイスでこれを行う方法を教えてもらえれば幸いです(そうでない場合は、コードは問題ありません)。

私はすでに私がpaintComponentメソッドをオーバーライドするはずですが(私はすでに行っていますが、イメージファイルは表示されていません)。また、私は2番目の質問があります。画像のフルパスを入れたくない場合は、ソースファイルをパッケージに入れて、イメージファイルをどこに置くのかがとても混乱します。

EDIT:initComponoents()は、Netbeansによって生成されたメソッドで、JFrameのプロパティを決定します。

public class TinyTowerOrganizerInterface extends javax.swing.JFrame { 

/** Creates new form TinyTowerOrganizerInterface */ 
    Image backgroundImage = Toolkit.getDefaultToolkit().getImage("D:/Java/TinyTowerOrganizer/Images/Background.jpg"); 

public TinyTowerOrganizerInterface() throws IOException { 

    initComponents(); 
    class BackgroundPanel extends javax.swing.JPanel{ 
     private Image image; 
     public BackgroundPanel(Image image){ 
      this.image = image; 
     } 
     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, null); 

     } 

    } 

} 

@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setTitle("Tiny Tower Organizer"); 
    setFont(new java.awt.Font("Pixelated", 0, 18)); // NOI18N 
    setMinimumSize(new java.awt.Dimension(900, 500)); 
    setName("frame"); // NOI18N 
    setResizable(false); 
    setUndecorated(true); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 900, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 500, Short.MAX_VALUE) 
    ); 

    pack(); 
} 


public static void main(String args[]) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       new TinyTowerOrganizerInterface().setVisible(true); 
      } catch (IOException ex) { 
       Logger.getLogger(TinyTowerOrganizerInterface.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 
} 
+0

「initComponents()」とは何ですか? – Moonbeam

+0

オリジナルの投稿に編集内容を記載しています。 "initComponoents()は、JFrameのプロパティを決定するNetbeansによって生成されたメソッドです。" – marionthefourth

答えて

3

私はすでに私はJFrameのは、paintComponent(...)メソッドを持っていませんpaintComponentメソッドに

を上書きすることになっていますことを知っています。

代わりに、paintComponent()メソッドでJPanel(またはJComponent)を拡張し、独自のペイントを追加する必要があります。次に、パネルをフレームに追加します。

また、パネルのgetPreferredSize()メソッドをオーバーライドしてイメージのサイズを返すことを忘れないでください。

編集:すべての

まずあなたがSSCCEは、私たちは、コードをコピーして実行することができ、コードの記事を投稿してください。私は以下の単純なSSCCEを含んでいます。

さまざまな問題があります。

最初の問題は、getImage()メソッドが画像を非同期に読み取るため、フレームが表示されているときにイメージが完全にロードされず、コードを実行したときに表示されるように何も表示されないことです。代わりにImageIOを使用してイメージを読み取ります。

それは私もあなたが上記の変更を行うと、あなたはまだのみパック()が呼び出されているにもかかわらず、小さなフレームが表示されたコードを実行すると

を達成取得したいことは何ですか。これは、あなたがFlowLayoutを使用しているため、デフォルトの推奨サイズが(10、10)であるように、あなたはポアンネルにコンポーネントを追加していないためです。したがって、getPreferredSize()メソッドをオーバーライドして、イメージのサイズを返して、パネルを正しくパックできるようにする必要があります。

import java.awt.*; 
import javax.swing.*; 
import java.io.*; 
import javax.imageio.*; 

public class MyApplication extends javax.swing.JFrame 
{ 

/** Creates new form MyApplication */ 
    Image backgroundImage = Toolkit.getDefaultToolkit().getImage("mong.jpg"); 

    public MyApplication() throws IOException 
    { 

     this.setContentPane(new JPanel() 
     { 

      @Override 
      public void paintComponent(Graphics g) 
      { 
       super.paintComponent(g); 
       g.drawImage(backgroundImage, 0, 0, null); 
      } 
     }); 

     pack(); 
     setVisible(true); 
    } 


    public static void main(String[] args) 
     throws Exception 
    { 
     new MyApplication(); 
    } 
} 
+0

申し訳ありませんが、JPanelのpaintComponentメソッドを、私が意味していたコードを見れば分かります。私はちょうど私が現在持っている現在のコードで何が間違っているか知る必要があります。コンパイルエラーなどはありませんが、画像は表示されません(正しいパスが記述されています)。 – marionthefourth

+0

申し訳ありませんが、コードを見ましたが、フレームのpaintComponent()メソッドをどこに拡張しようとしているかのように見えました。問題は、イメージを描画し、次にパネルの背景でイメージをペイントする通常のパネルペイントロジックを呼び出すことです。 super.paintComponent()は最初の文でなければなりません。 – camickr

+0

さて、私は同じ性質の私の以前の質問で、注文は私が書いた方法でなければならないことを見ていましたが、そうでなければ私はそれを変更します。しかし今、あなたは本当に私が最初にやっていたより多くの質問を私に残しました。そこで私は自分のJPanelクラスでJPanelを拡張しました。私はpaintComponentメソッドを自分のコードでオーバーライドし、パネルをフレームに追加しましたが、まだ運がありません。私が望むことをするためにgetPreferredSizeメソッドをうまく上書きするには? (私は何を達成したいのですか?) – marionthefourth

関連する問題