2011-07-18 33 views
2

這是我的第一個問題,請耐心等待。在Netbeans 7.0中向JFrame添加背景圖片時遇到問題

我正在研究一個應用程序(我已經完全設計)。現在我處於編碼階段,我無法在JFrame上放置背景圖像,同時仍然允許它扮演容器的角色,因此我可以在其上放置按鈕以及這種類型的東西。

我在Netbeans 7.0中創建了這個JFrame類文件,如果有人能告訴我如何通過Netbeans的接口來做到這一點,那將是很好的(如果沒有,只需要代碼就可以)。

我已經知道,我應該重寫paintComponent方法(我已經做了,但我的圖像文件沒有顯示)。另外我還有一個問題,我不想把圖像的完整文件路徑,我有我的源文件包,現在我很困惑,我要把我的圖像文件。

編輯: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()是由Netbeans生成的確定JFrame屬性的方法。」 – marionthefourth

回答

3

我已經知道我應該覆蓋paintComponent方法

的JFrame不具有的paintComponent(...)方法。

相反,您應該擴展JPanel(或JComponent)並在paintComponent()方法中添加自定義繪畫。然後將面板添加到框架。

此外,不要忘記重寫面板的getPreferredSize()方法以返回圖像的大小。

編輯:

首先,當您發佈代碼後一SSCCE,所以我們可以複製並執行代碼。我在下面加入了一個簡單的SSCCE。

存在不同的問題。

第一個問題是,getImage()方法讀取圖像異步,所以當顯示框架時,圖像沒有完全加載,並且沒有什麼要顯示,如您在運行代碼時可以看到的。而是使用ImageIO來讀取圖像。

它是什麼,我甚至想獲得完成

當你作出上述變化和運行代碼,你仍然只能看到即使包()已經被調用的小框架。這是因爲您沒有向poanel添加任何組件,所以默認首選大小爲(10,10),因爲您使用的是FlowLayout。因此,您需要重寫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