2013-04-20 75 views
3

我想使用不同背景的四個面板,並使用BorderLayout將它們合併在一起。我使用了JLabel,但我不能將任何組件添加到JLabel,因此我需要將其作爲背景。如何添加圖像作爲JPanel背景?

我搜索了一些代碼,但它只是告訴如何在JFrame中添加背景。

import javax.swing.*; 
import java.awt.*; 

public class LoginPanel extends JFrame{ 
private ImageIcon top = new ImageIcon("C:/Users/user/Desktop/top.png"); 
private ImageIcon mid = new ImageIcon("C:/Users/user/Desktop/mid.png"); 
private ImageIcon center = new ImageIcon("C:/Users/user/Desktop/center.png"); 
private ImageIcon bottom = new ImageIcon("C:/Users/user/Desktop/bottom.png"); 

public LoginPanel(){ 


    JPanel topp = new JPanel(); 
    topp.setLayout(new BorderLayout(0,0)); 
    topp.add(new JLabel(top),BorderLayout.NORTH); 


    JPanel centerp = new JPanel(); 
    centerp.setLayout(new BorderLayout(0,0)); 
    centerp.add(new JLabel(mid),BorderLayout.NORTH); 
    centerp.add(new JLabel(center),BorderLayout.SOUTH); 



    topp.add(new JLabel(bottom),BorderLayout.SOUTH); 
    topp.add(centerp,BorderLayout.CENTER); 


    add(topp); 

} 

public static void main(String[] args) { 
    LoginPanel frame = new LoginPanel(); 
    frame.setTitle("Test"); 
    frame.setSize(812, 640); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 
} 
+0

相關實施例:[JComponent的不與圖像的背景示出](http://stackoverflow.com/a/11372350/1057230) – 2013-04-21 02:44:39

回答

3

我會做一個名爲JImagePanel新的類,然後使用:

class JImagePanel extends JComponent { 
    private static final long serialVersionUID = 1L; 
    public BufferedImage image; 

    public JImagePanel(BufferedImage image) 
    { 
     this.image = image; 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // scale image 
     BufferedImage before = image; 
     int w = before.getWidth(); 
     int h = before.getHeight(); 
     BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
     AffineTransform at = new AffineTransform(); 
     at.scale(2.0, 2.0); 
     AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
     after = scaleOp.filter(before, after); 

     // center image and draw 
     Graphics2D g2d = (Graphics2D) g; 
     int x = (getWidth() - 1 - image.getWidth(this))/2; 
     int y = (getHeight() - 1 - image.getHeight(this))/2; 
     g2d.drawImage(image, x, y, this); 
     g2d.dispose(); 
    } 
} 
+1

雖然想法是好的,1爲,仍然我寧願在這種情況下做兩個更改。 1.)因爲我使用圖像作爲背景,因此我會覆蓋[getPreferredSize()](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html# getPreferredSize())方法,這樣'JComponent'將獲得圖像的大小。 2.)'paintComponent(...)'方法的訪問說明符將保持爲'protected'而不是'public' :-) – 2013-04-21 02:41:42