Java jPanel不工作的背景图像
我对GUI的制作还不熟悉,所以我决定尝试针对eclipse的windows builder,虽然很好,但我还是有一些疑问。我一直在搜索,但我找不到一个好方法来添加一个背景图像到我的“菜单”。例如,我尝试了以下方法:Java jPanel不工作的背景图像,java,image,swing,jpanel,embedded-resource,Java,Image,Swing,Jpanel,Embedded Resource,我对GUI的制作还不熟悉,所以我决定尝试针对eclipse的windows builder,虽然很好,但我还是有一些疑问。我一直在搜索,但我找不到一个好方法来添加一个背景图像到我的“菜单”。例如,我尝试了以下方法: public Menu() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(50, 50, 300, 250); //Dimensiones contentPane = new JPanel()
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
可能会被频繁调用,并且通常会快速连续调用
当组件调整大小时,让图像缩放是它自身的一个完整问题,对于一些想法,您可以看看
哦,而且,您应该避免直接从顶级容器进行扩展,如
JFrame
,它们降低了组件的可重用性,并将您锁定在单个容器中如果您对调整背景图像大小或应用任何效果不感兴趣,一个简单的方法是使用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
可能会被频繁调用,并且通常会快速连续调用
当组件调整大小时,让图像缩放是它自身的一个完整问题,对于一些想法,您可以看看
哦,而且,您应该避免直接从顶级容器进行扩展,例如
JFrame
,它们会降低组件的可重用性,并将您锁定在单个容器中不要尝试在绘制方法中加载资源。将它们作为类属性加载,然后简单地在画图中绘制。@AndrewThompson很抱歉,我说我对这方面很陌生,你能给我举个例子吗?我还建议使用ImageIO.read(URL)
加载图像,因为它提供了更多失败反馈。“你能给我举个例子吗?”你能付我钱吗?这是一个问答网站,而不是一个代码生成工厂。@CodeGrasshopper:请看一下如何创建。希望这能有所帮助:-)不要尝试在绘制方法中加载资源。将它们作为类属性加载,然后简单地在画图中绘制。@AndrewThompson很抱歉,我说我对这方面很陌生,你能给我举个例子吗?我还建议使用ImageIO.read(URL)
加载图像,因为它提供了更多失败反馈。“你能给我举个例子吗?”你能付我钱吗?这是一个问答网站,而不是一个代码生成工厂。@CodeGrasshopper:请看一下如何创建。希望这能有所帮助:-)非常感谢!Windows Builder提供的生成代码有点混乱,我将尝试使用您为此提供的示例。@CodeGrasshopper我希望它有助于澄清一些问题,您留下的参考资料将在将来对我有很大帮助。再次感谢,非常感谢!Windows Builder提供的生成代码有点混乱,我将尝试使用您为此提供的示例。@CodeGrasshopper我希望它有助于澄清一些问题,您留下的参考资料将在将来对我有很大帮助。再次感谢。