2011-11-04 105 views
2

如何將wall1.jpg設置爲我的JFrameJPanel的背景?如何在我的JPanel或JFrame中設置背景圖標?

public class JBackGroundImageClass extends JFrame 
{ 
    Image img; 
    private final JPanel JPanel; 

    public JBackGroundImageClass() 
    { 
    setLayout (new BorderLayout());  
    setBounds(22,33,400, 400); 
    setVisible(true); 

    img = Toolkit.getDefaultToolkit().createImage("wall1.jpg");  
    JPanel = new JPanel() 
    { 
     public void paintComponent(Graphics g) 
     {img = Toolkit.getDefaultToolkit().createImage("wall1.jpg"); 
     g.drawImage(img, 0, 0, null); 
     } 
    }; 

    this.add("North" , JPanel); 
    JPanel.setSize(400, 400); 
    JPanel.setBackground(Color.red); 
    JPanel.setVisible(true); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 


    public static void main(String[] args) 
    { 
    new JBackGroundImageClass().setVisible(true); 
    } 

} 
+2

「 Swing程序應該重寫'的paintComponent()',而不是覆蓋'的paint()'」 - [在AWT和Swing中繪製:繪製方法](http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks)。 – trashgod

+0

@trashgod:我重試了,但仍然一樣。 – YumYumYum

+0

檢查在這篇文章中接受的答案。我以前使用過相同鏈接的代碼,它的工作原理如下:http://stackoverflow.com/questions/4051408/jpanel-with-image-background –

回答

2

這裏有一個常用的方法:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class JBackGroundImageClass extends JFrame { 

    private Image img; 
    public JBackGroundImageClass() { 
     this.setLayout(new BorderLayout()); 
     try { 
      img = ImageIO.read(new File("image.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(System.err); 
     } 
     this.add(new JPanel() { 

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

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(img.getWidth(null), img.getHeight(null)); 
      } 
     }); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new JBackGroundImageClass().setVisible(true); 
      } 
     }); 
    } 
} 
+1

使用'ImageIO'。不要在'paintComponent()'中加載圖像。調用'super.paintComponent()'如果覆蓋組件。另請參閱[初始線程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

+0

工程,我不得不申請明確的目錄,如「/var/tmp/image.jpg」 – YumYumYum

+0

感謝您的另一課+1 – mKorbel

1

在由trashgod答案,沒有理由這樣做的風俗畫。圖像以其首選大小繪製。因此,您可以將ImageIcon添加到JLabel並將標籤添加到框架。您可以將標籤的佈局管理器設置爲您想要的任何內容,與面板上的相同。

你可以使用自定義的畫是要縮放在這種情況下,你會使用的圖像:

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)