Java JPanel平铺背景图像

时间:2014-07-14 21:33:57

标签: java image swing jframe jpanel

我目前有用于创建JOptionPane的代码,无论我将其设置为背景,都将图片平铺到背景:)

package test;
import java.awt.*;  
import java.awt.image.BufferedImage;  
import java.io.*;  
import javax.imageio.ImageIO;  
import javax.swing.*;  

public class TiledImage extends JPanel {  
    BufferedImage tileImage;  


    public TiledImage(BufferedImage image) {  
        tileImage = image;  
    }  

    protected void paintComponent(Graphics g) {  
        int width = getWidth();  
        int height = getHeight();  
        for (int x = 0; x < width; x += tileImage.getWidth()) {  
            for (int y = 0; y < height; y += tileImage.getHeight()) {  
                g.drawImage(tileImage, x, y, this);  
            }  
        }  
    }  

    public Dimension getPreferredSize() {  
        return new Dimension(240, 240);  
    }  

    public static void main(String[] args) throws IOException {  
        BufferedImage image = ImageIO.read(new File("./resource/patterngrey.png"));  
        TiledImage test = new TiledImage(image);  
        JOptionPane.showMessageDialog(null, test, "", JOptionPane.PLAIN_MESSAGE);  
    }  
} 

我遇到的问题是使用相同的代码将图像添加到JFrame中的JPanel背景中 这就是我所拥有的:

package test;
import java.awt.*;  
import java.awt.image.BufferedImage;  
import java.io.*;  
import javax.imageio.ImageIO;  
import javax.swing.*;  

public class TiledImage extends JPanel {  
    BufferedImage tileImage;  
    static JFrame mainFrame = new JFrame("Program Name");
    static JPanel userDetailsPanel = new JPanel();

    public TiledImage(BufferedImage image) {  
        tileImage = image;  
    }  

    protected void paintComponent(Graphics g) {  
        int width = getWidth();  
        int height = getHeight();  
        for (int x = 0; x < width; x += tileImage.getWidth()) {  
            for (int y = 0; y < height; y += tileImage.getHeight()) {  
                g.drawImage(tileImage, x, y, this);  
            }  
        }  
    }  


    public static void main(String[] args) throws IOException {  
        mainFrame.setSize(400,400);
        mainFrame.setLayout(new BorderLayout());
        mainFrame.add(userDetailsPanel, BorderLayout.CENTER);
        BufferedImage image = ImageIO.read(new File("./resource/patterngrey.png"));  
        TiledImage backgroundImage = new TiledImage(image);  
   //   userDetailsPanel.setComponent(backgroundImage); //i know this line is wrong 
   //but i dont know how to correct it
        mainFrame.setVisible(true);
    }  
} 

如果有更好的方法,那么任何和所有的帮助都会受到赞赏,这些代码也会很少。我需要在背景排序后在背景上添加标签和按钮。

背景需要平铺,因为应用程序在JFrame中有几个不同的JPanel,具有不同的图案背景,我想使框架可调整大小

3 个答案:

答案 0 :(得分:10)

java.awt.TexturePaint的实例提供了一种方便的方法来平铺BufferedImage。可以看到相关示例here。给定TexturePaint,您可以非常轻松地填充组件的背景,如here所示。

    private TexturePaint paint;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setPaint(paint);
        g2d.fillRect(0, 0, getWidth(), getHeight());
    }

image

答案 1 :(得分:3)

你说:

  

如果有更好的方法可以做到这一点,那么任何和所有的帮助都会受到赞赏,这些代码也会很好。

实际上并不是很多代码。我唯一可以建议的是,如果JPanel的大小不变,请创建一个背景BufferedImage,在其中绘制平铺图像,然后在JPanel的paintComponent方法或JLabel中绘制一个背景图像。图标。如果你选择后一种方法,那么给JLabel一个布局管理器,这样它就可以作为组件的良好容器。如果图像需要显示,请确保平铺容器顶部的任何内容都不透明,尤其是JPanels。

答案 2 :(得分:1)

要更正您当前遇到的问题,可以将TiledImage对象设置为JFrame的内容窗格,然后确保添加到其上的所有面板都不是不透明的。

即,

public static void main(String[] args) throws IOException {  
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    BufferedImage image = ImageIO.read(new File("./resource/patterngrey.png"));  
    TiledImage backgroundImage = new TiledImage(image);  
    // Make backgroundImage the content pane.
    mainFrame.setContentPane(backgroundImage);
    mainFrame.setLayout(new BorderLayout());
    // Make the userDetailsPanel not opaque.
    userDetailsPanel.setOpaque(false);
    mainFrame.add(userDetailsPanel, BorderLayout.CENTER);

    mainFrame.setSize(400,400);
    mainFrame.setVisible(true);
}