Java JPanel 平铺背景图像

2022-01-24 00:00:00 image java swing jpanel jframe

我目前拥有创建 JOptionPane 的代码,无论我将其设置为多大,都可以将图像平铺到背景上:)

I currently have the code for creating a JOptionPane that tiles an image to the background no matter the size I set it to :)

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 背景这是我所拥有的:

the problem I am having is using the same code to add an image to a JPanel background in a JFrame here is what I have:

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);
    }  
} 

如果有更好的方法来做这件事,那么任何和所有的帮助都是非常感谢的,而且代码少得多.对背景进行排序后,我确实需要在背景顶部添加标签和按钮.

Any and all help is appreciated if there is a better way of doing it that is a lot less code that would also be great. I do need to add labels and buttons on top of the background once i have my background sorted.

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

The background needs to be tiled as the application will have a couple of different JPanels in the JFrame with different pattern backgrounds and i would like to make the frame resizable

推荐答案

要解决您当前遇到的问题,您可以将 TiledImage 对象设置为 JFrame 的内容窗格,然后确保将任何面板添加到它不是不透明的.

To correct the issue you're currently having, you can set your TiledImage object as the content pane of your JFrame, and then ensure any panels that get added onto it are not opaque.

也就是说,

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);
}  

相关文章