【问题标题】:Java JPanel tiled background imageJava JPanel 平铺背景图像
【发布时间】:2014-07-14 21:33:56
【问题描述】:

我目前拥有创建 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,具有不同的图案背景,我想让框架可调整大小

【问题讨论】:

标签: java image swing jframe jpanel


【解决方案1】:

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

【讨论】:

  • 我忘了这个,我喜欢这个答案。 1+
【解决方案2】:

你说:

如果有更好的方法可以减少代码,那么任何和所有的帮助都会很棒。

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

【讨论】:

    【解决方案3】:

    要纠正您当前遇到的问题,您可以将 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);
    }  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多