我目前有用于创建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,具有不同的图案背景,我想使框架可调整大小
答案 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());
}
答案 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);
}