2012-10-23 71 views
7

我有一個JPanelJFrame。我裝上了JPanel但其表示只是其中的一部分圖片:這是我做這件事的部分代碼:如何將圖像大小適合JFrame大小?

JPanel panelImg = new JPanel() 
{ 
    public void paintComponent(Graphics g) 
    { 
     Image img = new ImageIcon("Welcome.png").getImage(); 
     Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); 
     setPreferredSize(size); 
     setMinimumSize(size); 
     setMaximumSize(size); 
     setSize(size); 
     setLayout(null); 
     g.drawImage(img, 0, 0, null); 
    } 
}; 
mainFrame.add(panelImg); 

因此,這是它的樣子:

Picture 1

完整的畫面是這樣的:

enter image description here

有規模的PICT方式對JFrame的大小?在此先感謝

+2

看一看一些答案:http://stackoverflow.com/a/12660146/1133011這裏http://stackoverflow.com/a/12996718/1133011他們都表演如何在'JPanel' /'JFrame'上顯示和縮放圖像。你現在只需要通過getWidth()和getHeight()來調整幀大小(+1 to @trashgod和@MadProgrammer) –

回答

12

首先,我不會被加載paintComponent方法內的圖像,這種方法是調用反覆(和快速連續某些次),你不想做任何事情,花費時間來執行或不必要

退房Java: maintaining aspect ratio of JPanel background image消耗資源用於建議對充/嵌合圖像的給定區域

+0

關於延遲的好處; [強制性示例](http://stackoverflow.com/a/4530659/230513)。 – trashgod

13

你想drawImage()縮放到目標容器。請參閱引用here的文章。例如,

g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
+0

謝謝我嘗試了第一個答案並且完美地工作。 –

2
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel { 

    Image image; 

    public void setBackground(Image image) { 
     this.image = image; 
    } 

    @Override 
    public void paintComponent(Graphics G) { 
     super.paintComponent(G); 
     G.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null); 
    } 

} 

然後使用ImagePanel對象方法SetBackground

imagePanel1.SetBackGround(ImageIO.read(new File("extensions/images/background.jpg"))); 
+2

默認情況下,JPanel是不透明的。因此,您對paintComponent的實現可能會違反其不透明合約(如果圖像未完全不透明)。要修復,請調用super.paintComponent或將opaque屬性設置爲false。順便說一句:請學習java命名約定並堅持下去。 – kleopatra

+0

完成:D .. thx:D –

+2

好 - 現在修復命名,讓我真的很高興:-) – kleopatra

0

你可以試試這個:

Image img = new ImageIcon(ImageIO.read(new File("welcome.png")) 
           .getScaledInstance(WIDTH, HEIGHT, Image.SCALE_SMOOTH))); 
1

它很容易。按照這個例子,

public class BasePanel extends JPanel { 

ImageIcon backImage; 
public BasePanel() { 
    backImage = new ImageIcon("src/images/welcome.png"); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    BufferedImage scaledImage = getScaledImage(); 
    super.paintComponent(g); 
    g.drawImage(scaledImage, 0, 0, null); 
} 

private BufferedImage getScaledImage(){ 
    BufferedImage image = new BufferedImage(getWidth(),getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2d = (Graphics2D) image.createGraphics(); 
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY)); 
    g2d.drawImage(backImage.getImage(), 0, 0,getWidth(),getHeight(), null); 

    return image; 
} 

}