我是制作 GUI 的新手,所以我决定尝试 eclipse 的 windows 构建器,虽然很棒,但我确实有一些疑问。我一直在搜索,但找不到将背景图像添加到我的“菜单”的好方法。例如我试过这个:
public Menu() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(50, 50, 300, 250); //Dimensiones
contentPane = new JPanel() { //Imagen de Fondo
public void paintComponent(Graphics g) {
Image img = Toolkit.getDefaultToolkit().getImage(
Menu.class.getResource("/imgs/rotom.jpg"));
g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
}
};
并添加以下类:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
但无济于事,窗口仍然保持暗灰色,到目前为止,我的代码只是 WindowsBuilder 为您编写的标准代码加上 4 个按钮,但我怀疑它们在这里是否重要。我添加的代码不应该覆盖 jPanel 的 paintComponent() 方法并在其中绘制图像吗?
菜单类在我的项目中的一个包中,图像也在同一个项目中的 imgs 包中。
非常感谢。
最佳答案
如果您对调整背景图像大小或应用任何效果不感兴趣,一个简单的方法是使用 JLabel
...
BufferedImage bg = ImageIO.read(Menu.class.getResource("/imgs/rotom.jpg"));
JLabel label = new JLabel(new ImageIcon(bg));
setContentPane(label);
setLayout(...);
这种方法有局限性(除了缩放之外),因为标签的首选大小始终是图像的大小,从不考虑它的内容。这既好又坏。
您似乎正在使用的另一种方法是使用专门的组件
public class BackgroundPane extends JPanel {
private BufferedImage img;
public BackgroundPane(BufferedImage img) {
this.img = img;
}
@Override
public Dimension getPreferredSize() {
return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
}
}
您应该避免尝试在 paintComponent
方法中执行任何可能需要时间才能完成的任务,因为 paintComponent
可能经常被调用,而且通常是快速连续调用....
在调整组件大小时使图像缩放本身就是一个完整的问题,对于一些想法,您可以看看...
- Java: maintaining aspect ratio of JPanel background image
- Java: JPanel background not scaling
- Quality of Image after resize very low -- Java
- Reading/Loading images
哦,还有,你应该避免直接从顶级容器扩展,比如 JFrame
,它们会降低组件的可重用性并将你锁定在一个容器中
关于java - jPanel 的背景图像不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637242/