【问题标题】:install4j: Change label colorinstall4j:更改标签颜色
【发布时间】:2015-07-13 18:51:38
【问题描述】:

我有三个Run executable or batch file 操作,它们调用我的启动脚本,分别跟踪日志文件,并验证每个服务是否已完全启动。我会在 install4j 中使用本机启动操作,但这些服务需要按顺序启动 - 同步 - 每个服务最多需要 30 秒。

在每个操作之后,我都有一个Run script 操作来验证返回代码并确定其余脚本是否也应该执行。在表单本身上,它显示了已安装的组件,我想在成功启动后添加一个图标并更改每个标签的颜色。

如果这让您感到困惑,请查看下面的屏幕截图以更好地理解。

一如既往,感谢您的支持。

克里斯

【问题讨论】:

  • 有趣的问题!

标签: java bash install4j


【解决方案1】:

诀窍是如何从“运行脚本”操作中获取屏幕的表单环境。可以包含表单组件的屏幕是com.install4j.api.screens.FormPanelContainer 的一个实例,该类提供对com.install4j.api.formcomponents.FormEnvironment 的访问。

在“运行脚本”操作中,您可以这样做:

import java.awt.EventQueue;
import java.awt.Color;

EventQueue.invokeLater(new Runnable() {
    public void run() {
        FormEnvironment formEnvironment = 
            ((FormPanelContainer)context.getScreenById("screenId")).getFormEnvironment();
        JComponent label = (JComponent)formEnvironment.getFormComponentById("componentId").
             getConfigurationObject();
        label.setForeground(Color.MAGENTA);
    }
});
return true;

为“screenId”和“componentId”设置适当的值。

添加更可重用的解决方案

import java.awt.EventQueue;
import java.awt.Color;

public static void changeColor(final String screenId, final String componentId, 
                               final Color color, final Context context) 
{
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            FormEnvironment formEnvironment = 
               ((FormPanelContainer)context.getScreenById(screenId)).getFormEnvironment();
            JComponent label = (JComponent)formEnvironment.getFormComponentById(componentId).
                getConfigurationObject();
            label.setForeground(color);
        }
    });
}

到“安装程序->自定义代码和资源”步骤(install4j 6+)上的静态代码并调用

changeColor("screenId", "componentId", java.awt.Color.GREEN, context);

在您的“运行脚本”操作中。


要设置图标,您必须在一个标签组件上定义“图标”属性,并使用“初始化脚本”属性将其保存在上下文中并从标签中删除:

context.setVariable("checkIcon", configurationObject.getIcon());
configurationObject.setIcon(null);

那么在上面的代码sn-ps中调用label.setForeground();之后,就可以调用了

    label.setIcon((Icon)context.getVariable("checkIcon"));

【讨论】:

  • Ingo,这很完美!我希望这不会太过分,但是否也可以更改图标?我在每个服务旁边都有一个加载图标,如果可能的话,我想将其更改为复选标记!谢谢你的帮助:)
  • 我已经尝试了图标实现并意识到服务将处于 3 种不同的状态:正在启动(加载图标)、已启动(复选标记图标)或失败(X 图标)。可见性脚本是否阻止初始化脚本执行?有时不会设置所有 3 项服务,因此不会出现一些图标。我猜我必须创建 3 个包含初始化脚本的空白标签?
  • 是的,您必须使用 3 个虚拟标签。初始化脚本将始终运行,即使可见性脚本返回 false。
  • 明白了。当我将 setIcon 附加到 setForeground 之后时,它告诉我它不是一个有效的组件。
  • 代码正是你上面的代码。我将label.setIcon((Icon)context.getVariable("checkIcon")) 直接放在设置前景的行下方,它告诉我 setIcon 不是有效组件。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2017-07-09
  • 2017-03-28
  • 2011-06-07
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多