【问题标题】:Why does a picture appear in the GUI Builder and on the device but not in Codename One Simulator?为什么图片会出现在 GUI Builder 和设备上,但不会出现在 Codename One Simulator 中?
【发布时间】:2018-02-19 18:37:30
【问题描述】:

我正在使用 GUI Builder 设计我的应用 UI。我创建了一个新表单并定义了如下样式:

FinishFlagIcon {
background-image: url(pics/FinishFlag.png);
cn1-background-type: cn1-image-scaled-fit;
cn1-source-dpi: 320;
font-size: 11.9mm; 
}

我在标签上设置了这种样式,它会出现在 GUI Builder 上。

但是,当我在模拟器中启动项目时,它不再出现。

我还尝试使用 Scaled Label 并将图标定义为 FinishFlag(存在于 res 文件中),它再次出现在 GUI Builder 中但不在模拟器中。当然,控制台中没有打印错误告诉我找不到文件。

请注意:res/myCustomTheme.css 文件夹包含所有与 png 相关的子文件夹(这些子文件夹中填充了从低到高清的 png),src/theme.res 包含图片(遵循 Shai 的建议):

那么我应该怎么做才能让图片出现在模拟器中呢?

编辑:我尝试手动编写 UI 代码并将标签(上面定义的 UIID)添加到 BorderLayout 的中心区域。在标签中添加 3 个或更多空格之前,我也不会出现。我没有再次尝试使用 GUI Builder。我觉得很奇怪,是故意的吗?

2017 年 9 月 13 日编辑:如果我构建应用程序并在真正的 Android 设备上打开它,则会出现标签。

编辑 2017 年 9 月 15 日:对于遇到组件未显示问题的人,如已接受的答案中所建议,解决方案包括 删除未显示组件的顶部或底部约束并将其设置为自动(单击lock) 以便为组件提供足够的空间。所以最终在将进度条的底部约束设置为“自动”之后,标签上的预期结果会出现在模拟器上:

任何帮助表示赞赏,

【问题讨论】:

  • 如果您打开 src/myCustomTheme.css 文件,并在“图像”下查看,您会在其中看到 FInishFlag.png 图像吗?
  • 当我打开 /src/myCustomTheme.css.res 时,我可以看到包括 FinishFlag.png 在内的所有图像。但是如果我打开 /ser/theme.res 则 FinishFlag.png 文件不存在。然而,theme.res 中存在“工作”图像(也许我手动将它添加到 theme.res 但我不记得了)。我忘了告诉我在 theme.res 中使用了常量 OverlayThemes 来在 theme.res 之后自动加载 myCustomTheme.css。我应该删除这个常量吗?

标签: css codenameone


【解决方案1】:

您的问题中的图片是红鲱鱼。看起来问题出在您的布局插图上。请注意,模拟器中没有显示任何较低的组件。 “进度”标签、三个零等……

我看不到您对标志或零标签使用的约束,但我可以看到“进度”标签在顶部和底部都有固定的插图。如果没有足够的空间,这可能会导致高度为零。尝试将顶部或底部插图更改为“自动”,以便它们灵活。

尝试将模拟器更改为使用桌面主题,这样您就可以调整窗口大小并查看不同大小的表单的外观。

您还可以通过覆盖表单的 layoutContainer() 方法轻松验证这一点,并检查您的标志标签的高度:

public void layoutContainer() {
   super.layoutContainer();
   System.out.println("finishflag height: "+gui_FinishFlag.getHeight());
}

【讨论】:

  • 钓鱼好 ;-)!事实上,所有组件都出现在桌面上。这是我第一次遇到这个问题(这也是我第一次在项目中使用 GUI Builder)。但是为什么这些组件都出现在真机上呢?如果设备或模拟器上的空间不足,它们不应该出现,不是吗?无论如何感谢您的大力支持!
  • 设置为自动使布局按预期运行!谢谢@stevehannah!
【解决方案2】:

我不确定什么是“正确”的解决方案,所以也许史蒂夫可以插话,但这就是正在发生的事情。

您有两个资源文件:themetheme.css

theme.css 中的图片非常适合您的风格。但是,由于加载过程加载的是theme 而不是theme.css,模拟器不知道这些图像,因为theme res 文件不知道它们。

GUI builder 可能正在扫描此处的所有 res 文件,因此它可以让您执行可能是错误的操作...您可以使用以下选项来解决此问题:

  • 加载 theme.css 并丢弃 theme - 您需要定义 inheritNativeThemeBool 标志,如果采用这种方法,则不应再使用设计器工具

  • 使用设计器工具而不是 CSS 来加载图像

  • 使用Resources.open显式加载css res文件并显式传递给Form

  • 使用Resources.open显式加载css res文件并设置为全局资源文件

【讨论】:

  • 感谢 Shai 提供这些解释和解决方法。我会寻求你的最后一个提示,因为我想要一些简单明了的东西来维护。当它工作时,我会及时通知你们。
  • 但是你看到我昨天的编辑了吗?如果我在标签上添加至少 3 个空格,我可以通过对 GUI 进行手工编码使其出现。和你解释的Shai有关吗?
  • 我添加了 css = Resources.openLayered("/myTheme.css"); UIManager.getInstance().addThemeProps(css.getTheme(css.getThemeResourceNames()[0])); 并从 theme.res 中删除了 OverlayThemes 而没有更改。我宁愿尝试与设计师一起加载图像并告诉你这是否有效。
  • 使用设计器加载图像并没有改变任何东西。看起来这是一个不同的问题。让我印象深刻的是需要 3 个空格来显示图像。
  • 两种方式(使用 OverlayThemes 或使用 Resources.openLayered() 显式打开)都应该有效。您实际上可能会遇到标签根本不显示的问题。尝试在你的 UI 中创建一个你知道会被渲染的组件。例如。一个带有标签的按钮...一旦您确认它显示在您的 UI 中,请尝试将 UIID 更改为 FinishFlagIcon 并查看它是否显示。
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2013-09-01
  • 1970-01-01
  • 2013-11-21
  • 2017-06-25
相关资源
最近更新 更多