显示带有图像背景的 GUI 组件时出现问题

Posted

技术标签:

【中文标题】显示带有图像背景的 GUI 组件时出现问题【英文标题】:Problems displaying GUI components with img background 【发布时间】:2015-06-21 22:45:36 【问题描述】:

我已经为我的 Java 小程序添加了背景,我需要一些帮助来理解为什么小程序不能正确显示。为了显示这个背景图片,我使用了下面的代码:

BufferedImage img = null;

try 
            URL url = new URL(getCodeBase(), "Backgrounds/Background.png");
            img = ImageIO.read(url);
        
        catch (Exception e) 

        

然后也把这个放到paint方法中...

public void paint(Graphics g) 
    g.drawImage(img, 0, 0, null);

问题是在绘制背景时您看不到按钮和标签等 GUI 组件,即使在其他 GUI 组件添加到内容窗格之前绘制背景也是如此。可以让组件出现,但您必须先突出显示它们或单击它们。

此图为小程序加载时的小程序:

然后这是我在屏幕上点击了几个地方后的小程序:

【问题讨论】:

为什么要编写小程序?如果是老师指定的,请参考Why CS teachers should stop teaching Java applets。 是的,这是一个大学作业,我真的没有太多选择 【参考方案1】:
public void paint(Graphics g) 
    g.drawImage(img, 0, 0, null);

首先,该方法调用应该是:

public void paint(Graphics g) 
    g.drawImage(img, 0, 0, this); // Every Component is an image observer

然后,修复损坏的油漆链:

public void paint(Graphics g) 
    super.paint(g); // Draw the rest of the components!
    g.drawImage(img, 0, 0, this); // Every Component is an image observer

【讨论】:

其他组件实际上并没有绘制,它们只是通过各种不同的方法添加到内容窗格中,抱歉我没有说得太清楚 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 @JL9 当然可以,但是paint负责绘制子组件,如果您不调用super.paint,它们将不会被绘制为父容器的一部分... @MadProgrammer 我确实尝试将 super.paint 放入其中并没有什么不同,子组件仍然像上图一样显示,您必须突出显示它们才能看到它们 @jl9 然后,您的代码中还有其他一些您没有向我们展示的内容。您还应该检查 img 是否为 null,因为绘制 null img 会导致问题...

以上是关于显示带有图像背景的 GUI 组件时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将背景图像加载为视图时出现小的白色间隙

使用带有 iOS 5 SDK 的 TTThumbsViewController 时出现奇怪的白条

在 Django 模板中获取图像时出现代码 404

带有 React JS Div 和组件的全屏背景图像

在 Android WebView 中显示谷歌纵横位置徽章时出现问题

显示图像列表时出现应用小部件问题