2011-11-04 70 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)