2013-04-20 4 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) –

ответ

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.) Спецификатор Access для метода paintComponent (...) 'останется' protected' вместо 'public' :-) –

Смежные вопросы