【问题标题】:How can I add images as a JPanel background?如何将图像添加为 JPanel 背景?
【发布时间】:2013-04-21 04:29:42
【问题描述】:

我想制作四个使用不同背景的面板,然后使用BorderLayout 将它们合并在一起。我使用了JLabel,但我无法将任何组件添加到JLabel,因此我需要将其作为背景。

我搜索了一些代码,但它只告诉了如何在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);
  }
}

【问题讨论】:

标签: java swing background jpanel border-layout


【解决方案1】:

我会创建一个名为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.)由于我使用图像作为背景,因此我将覆盖getPreferredSize() 方法,以便JComponent 将获得图像的大小。 2.) paintComponent(...) 方法的访问说明符将保持为 protected 而不是 public :-)
【解决方案2】:
猜你喜欢
  • 2016-02-15
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多