【问题标题】:Setting Loaded GIF as a Background将加载的 GIF 设置为背景
【发布时间】:2014-03-24 08:03:49
【问题描述】:

情况:我有一个JFrame,我已成功导入 GIF 并将其显示在主面板中,但是它将我的所有其他面板向下移动,导致我的 GUI 混乱。

问题:我应该如何将 GIF 设置为背景,而不是像我正在做的那样添加到主面板?

注意:代码只是制作一个Jframe,设置它的详细信息,添加面板然后将GIF显示为Jlabel。如果您需要代码,我可以在下面显示。

【问题讨论】:

标签: java swing


【解决方案1】:

您可以在 style.css 中执行此操作,因此适用于整个身体。

body { background-position: center center; background-image: url('../images/MyGif.gif'); background-repeat: no-repeat; }

或为它创建一个类

.frame{ background-position: center center; background-image: url('../images/MyGif.gif'); background-repeat: no-repeat; }

【讨论】:

  • 这不是 java.. 可能是 javafx 但 op 正在寻找 swing。
【解决方案2】:

更新答案

现在按照 @MadProgrammer 正确指示的 Oracle 的 Swing UI 指南

添加背景的最佳方法是简单地绘制它。创建一个BackgroundPanel(扩展JPanel)并覆盖paintComponent(...);

public class BgPanel extends JPanel
{ 
    //Overload and paint your background
    public void paintComponent(Graphics g)
    {
        //create image object, or more preferably do that in the BgPanel constructor
        g.drawImage(image, 0, 0, null);
    }
}

在使用 Swing 时按照 Oracle 的自定义呈现指南。

【讨论】:

  • 这个建议至少有 3 个问题。 1-您正在覆盖paint,这是不推荐的。 2-您在执行一些自定义绘画之后调用paint,这可能只是用背景颜色填充组件表面,完全覆盖您刚刚所做的一切。 3-除非您打算对图像进行某种调整或效果,否则这是很多工作而收效甚微
  • 至于 1 - 我不同意。覆盖 paint 或 paintCompnent (取决于你想要做什么),据我所知,你想要做出与如何绘制组件有关的更改(?) . 2 - 是的,除非您在面板上相应地设置不透明,我在“概念代码”建议中忘记了这一点。 3 - 是的,我同意。但它有效,我已经在多个项目中使用了这种方法而没有问题,但代价是必须制作一个背景类——但是,如果做得更通用,这是一项简单的任务,可以在项目的其他地方重复使用.
  • 覆盖绘画作品,因为它实现绘画,但它是improper for Swing
  • paintComponent 绘制背景,无需使其透明,在上下文中是正确的选择,通常是推荐的方法。可以在不调用父级的paint方法的情况下绘制子级,从而导致各种讨厌的效果。第 3 点关注的事实是,已经有一个现成的组件可用于实现相同的结果,并且具有许多内置功能。覆盖paint 很危险,导致的问题多于它解决的问题,并且由于多种原因通常不鼓励......
  • 明白了; “希望实现自己的绘制代码的 Swing 组件的扩展应将此代码放在paintComponent() 方法的范围内(而不是在paint() 内)。”我站得更正了。谢谢! ;)
【解决方案3】:

您可以通过多种方式实现这一目标...

你可以...

使用JLabel,将标签的图标属性设置为图像的引用。然后,您可以将布局管理器应用于标签并将标签设置为其余组件的主容器,只需像往常一样将它们添加到它...

IconImage image = ...;
JLabel background = new JLabel(image);
background.setLayout(...);
// You could set the frames content pane to the label and keep
// working as per normal, adding components to the frame
setContentPane(background);
// or, simply add components to it directly like any other container
background.add(...);

这样做的好处是,如果 GIF 是动画的,它将包含正常播放...很好的副作用。缺点是,JLabel 不会为您调整图像大小...

你可以...

将图像绘制到组件的背景上,例如JPanel,然后将剩余的组件添加到其中。

如果您愿意,这将允许您应用特殊效果和/或调整图像大小。但是,如果它是动画 GIF,则它会变得极其复杂,因为您需要自己为帧设置动画。

看看……

更多详情

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 2020-12-13
    • 1970-01-01
    • 2020-08-23
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多