java swing背景图片

Posted

技术标签:

【中文标题】java swing背景图片【英文标题】:java swing background image 【发布时间】:2011-01-14 16:57:45 【问题描述】:

我正在使用 JFrame,并且在我的框架上保留了背景图像。现在的问题是图像的大小小于框架的大小,所以我必须在窗口的空白部分再次保留相同的图像。如果用户单击最大化按钮,我可能不得不在运行时将图像放在框架的空白区域。谁能告诉我如何做到这一点?

【问题讨论】:

“我必须在空白部分再次保留相同的图像”对我来说没有意义。你能用你所拥有的和你想要的来创建一个图像吗? 【参考方案1】:

在多次使用背景图像而不是调整其大小或仅将其居中显示时,您想要类似于 Windows 桌面的背景图像?

你只需要保存一次图像,然后在paintComponent方法中多次绘制。

【讨论】:

你能给我一个示例代码吗?如果你有。这对我会有很大的帮助。请问?【参考方案2】:

听起来好像您在谈论平铺与拉伸,但不清楚您想要哪种行为。

这个程序有两个例子:

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main 
    public static void main(String[] args) throws IOException 
        final Image image = ImageIO.read(new URL("http://sstatic.net/so/img/logo.png"));
        final JFrame frame = new JFrame();
        frame.add(new ImagePanel(image));
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    


@SuppressWarnings("serial")
class ImagePanel extends JPanel 
    private Image image;
    private boolean tile;

    ImagePanel(Image image) 
        this.image = image;
        this.tile = false;
        final JCheckBox checkBox = new JCheckBox();
        checkBox.setAction(new AbstractAction("Tile") 
            public void actionPerformed(ActionEvent e) 
                tile = checkBox.isSelected();
                repaint();
            
        );
        add(checkBox, BorderLayout.SOUTH);
    ;

    @Override
    public void paintComponent(Graphics g) 
        super.paintComponent(g);
        if (tile) 
            int iw = image.getWidth(this);
            int ih = image.getHeight(this);
            if (iw > 0 && ih > 0) 
                for (int x = 0; x < getWidth(); x += iw) 
                    for (int y = 0; y < getHeight(); y += ih) 
                        g.drawImage(image, x, y, iw, ih, this);
                    
                
            
         else 
            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        
    

【讨论】:

您好,您对如何平铺图像而不是拉伸图像以保持图像质量有什么建议吗?【参考方案3】:

平铺图像的另一种方法是使用TexturePaint

public class TexturePanel extends JPanel 

    private TexturePaint paint;

    public TexturePanel(BufferedImage bi) 
        super();
        this.paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight()));
    

    @Override
    protected void paintComponent(Graphics g) 
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(paint);
        g2.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    

【讨论】:

以上是关于java swing背景图片的主要内容,如果未能解决你的问题,请参考以下文章

java中的swing设计界面时怎么加上背景图片。而不覆盖啥label等控件?

java swing 怎么让图片大小随着窗口的缩放而缩放?为啥我插入的图片尺寸不变?

Java swing 窗体如何设置背景图片?

java中swing界面上怎么给jpanel上添加背景图片

Java在窗口中设置背景图片

java中如何为JFrame设置背景图片,拜托给一个简单的实例。谢谢了。