2012-03-23 103 views
2

我在主題上閱讀了幾個答案,但是我還沒有找到答案。 我想爲我的java代碼的背景。 我在這裏只提到圖像代碼 但它不起作用。在Java Swing應用程序中顯示背景圖像

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class background extends JFrame { 
    private Container c; 
    private JPanel imagePanel; 

    public background() { 
     initialize(); 
    } 

    private void initialize() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     c = getContentPane(); 
     imagePanel = new JPanel() { 
      public void paint(Graphics g) { 
       try { 
        BufferedImage image = ImageIO.read(new File("http://www.signe-zodiaque.com/images/signes/balance.jpg")); 
        g.drawImage(image, 1000, 2000, null); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     imagePanel.setPreferredSize(new Dimension(640, 480)); 
     c.add(imagePanel); 
    } 
+4

* 「這是行不通的」 *也許是罷工,或昏昏欲睡,或只是簡單的懶惰。首先,談判。對於第二個,給它一個好的晚上休息,並在早上嘗試。對於第三,嘗試胡蘿蔔和棒的方法。對於其他任何事情,請嘗試描述1)你期望發生什麼2)實際發生了什麼,以及用途3)爲什麼你期望(1)發生。 – 2012-03-23 21:44:41

回答

6

您從哪裏找到該代碼?如果來自教程,請放棄它,因爲它教你非常不好的習慣。例如,...

  • 從未想從paint(...)paintComponent(...)方法內的圖像文件(或任何文件)來讀取。首先,爲什麼每次重新繪製文件時都要重新讀取文件,以便一次讀取並完成。但更重要的是,你希望你的paint/paintComponent方法變得精益,平均和儘可能快,因爲如果沒有,並且你的繪圖速度慢,klunky,用戶會覺得你的程序很慢並且很快。
  • 在JPanel的paintComponent(...)方法中執行繪圖,而不是其paint(...)方法。當您畫畫時,您會失去Swing免費提供的所有雙緩衝,並且您的動畫會變得不平穩。
  • 先調用super的paintComponent(...)方法。
  • 閱讀官方Painting with Swing tutorials關於如何在Swing中進行圖形和繪圖,正如我從上面的代碼猜測,你還沒有完成這個最基本的步驟。你不會後悔這樣做。
  • 此外,你似乎試圖加載一個url作爲一個文件,我不相信會工作。改爲使用URL對象。

例如...

public class ZodiacImage extends JPanel { 
    private static final String IMG_PATH = "http://www.signe-zodiaque.com/" + 
     "images/signes/balance.jpg"; 
    private BufferedImage image; 

    public ZodiacImage() { 
     // either read in your image here using a ImageIO.read(URL) 
     // and place it into the image variable, or else 
     // create a constructor that accepts an Image parameter. 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (image != null) { 
     // draw your image here. 
     } 
    } 

    @Override //if you want the size to match the images 
    public Dimension getPreferredSize() { 
     if (image != null) { 
     return new Dimension(image.getWidth(), image.getHeight()); 
     } 
     return super.getPreferredSize(); 
    } 
} 
+3

添加到'g.drawImage(image,1000,2000,null);'幾乎同樣愚蠢。這些合作伙伴將離開我的物理屏幕,並且容器應該用作'ImageObserver'。然後在Swing面板中覆蓋'paint()',從而不必要地擴展Swing框架(似乎),試圖將應用程序資源加載爲'File' ..該代碼可能比行更多地出現錯誤。 – 2012-03-23 21:41:54

+3

@ leen.zd:''我們總是使用這種方法''不是使用它的好理由,除非你指的是我們的意思是Joshua Bloch或者James Gosling。當您畫畫時,您會失去Swing免費提供的所有雙緩衝,並且您的動畫會變得不平穩。另外,'「但它不起作用」「並沒有說明什麼。它怎麼不工作?什麼不行?任何錯誤?來吧,給出重要的細節。 – 2012-03-23 21:44:13

+3

@leen:你也試圖加載一個web資源作爲文件,請參閱編輯。 – 2012-03-23 21:46:59