你好,我正在使用 JPanel 作为我的框架容器然后我真的想在我的面板中使用背景图片我真的需要帮助这是我的代码到目前为止。这是更新,请检查这里是我的代码
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class imagebut extends JFrame
{
public static void main(String args [])
{
imagebut w = new imagebut();
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w.setSize(300,300);
w.setVisible(true);
}
public imagebut()
{
setLayout(null); // :-)
PicPanel mainPanel = new PicPanel("picturename.jpg");
mainPanel.setBounds(0,0,500,500);
add(mainPanel);
}
class PicPanel extends JPanel{
private BufferedImage image;
private int w,h;
public PicPanel(String fname){
//reads the image
try {
image = ImageIO.read(new File(fname));
w = image.getWidth();
h = image.getHeight();
} catch (IOException ioe) {
System.out.println("Could not read in the pic");
//System.exit(0);
}
}
public Dimension getPreferredSize() {
return new Dimension(w,h);
}
//this will draw the image
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image,0,0,this);
}
}
}
原文由 Batusai 发布,翻译遵循 CC BY-SA 4.0 许可协议
有许多方法可以实现这一点。
你可以…
免责声明
请注意,为此目的使用
JLabel
可能会导致内容溢出容器,详情请参见下文创建一个
JLabel
,将图像应用于它的icon
属性并将其设置为框架内容窗格。然后您需要适当地设置布局管理器,因为JLabel
没有默认布局管理器用完整的例子更新
这个问题是
JLabel
调整框架大小时不会调整图像大小警告- 如果子组件所需的空间超过背景图像的大小,使用
JLabel
可能会导致问题,因为JLabel
不会根据其内容计算其首选大小,但是基于其icon
和text
属性你可以…
创建一个自定义组件,从类似于
JPanel
的东西扩展并覆盖它的paintComponent
方法,按照您认为合适的方式绘制背景。查看 执行自定义绘画 以了解更多详细信息。
这使您能够决定在可用空间发生变化时图像的最佳缩放方式。虽然有多种方法可以实现这一点,但您应该通读 Image.getScaledInstance() 的风险 以了解它们的优缺点。
这就提出了一堆新问题,你想缩放它们并保持纵横比吗?如果是这样,您是要使图像适合可用区域还是填充它(以便它始终覆盖可用空间)?
查看 Java:保持 JPanel 背景图像的纵横比以 获取更多详细信息。
其他注意事项
图像通常最好通过
ImageIO
API 加载,因为它能够加载范围广泛的图像,但也会在出现问题时抛出IOException
。有关详细信息,请参阅 读取/加载图像。
图片的位置也很重要。如果图像在应用程序外部(文件系统上的某个位置),您可以使用
ImageIO.read(new File("/path/to/image"))
。但是,如果图像嵌入到您的应用程序中(例如存储在 Jar 中),您将需要使用更像ImageIO.read(getClass().getResource("/path/to/image"))
的东西……例如…
例子
此示例演示如何使用充当背景组件的自定义组件。当组件大小超过背景图像的大小时,图像会按比例放大以填充可用的内容区域。
当空间减少时,也将图像按比例缩小是一件简单的事情,但我特意决定将图像保持在最小尺寸。
该示例还使用自定义分而治之的缩放算法来生成高质量的缩放结果。