2013-04-20 69 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