Eclipse RCP 应用程序 - 自定义启动屏幕

2024-06-28

我目前正在开发一个 Eclipse RCP 应用程序,在其中我尝试实现一个自定义启动屏幕处理程序,显示一个进度条(行为类似于您可以在 .product 定义中定义的默认进度条)和多个循环背景图像。

以这种方式编辑主应用程序插件的扩展后:

[...]
<!-- install custom splash handler -->
<extension point="org.eclipse.ui.splashHandlers">
   <splashHandler
        class="com.example.application.splash.SlideShowSplashHandler"
        id="splash.slideshow">
   </splashHandler>
   <splashHandlerProductBinding
        productId="com.example.application.product"
        splashId="com.example.application.splash.slideshow">
   </splashHandlerProductBinding>
</extension>
<!-- define images (in plugin root directory) to be shown -->
<extension point="com.example.application.splashExtension">
     <splashExtension id="01" image="01_Splash2Ag.bmp"></splashExtension>
     <splashExtension id="02" image="02_Splash3Ag.bmp"></splashExtension>
     <splashExtension id="00" image="00_Splash1Ag.bmp"></splashExtension>         
</extension>
[...]

我正在尝试实现自定义闪屏处理程序类:

public class SlideShowSplashHandler extends AbstractSplashHandler {

    private List<Image> fImageList;
    private ProgressBar fBar;
    private final static String F_SPLASH_EXTENSION_ID = "com.example.application.splashExtension"; //NON-NLS-1
    private final static String F_ELEMENT_IMAGE = "image"; //NON-NLS-1
    private int imageIdx = 0;

    public SlideShowSplashHandler() {
        fImageList = new ArrayList<Image>(5);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets.Shell)
     */
    public void init(Shell splash) {
        // Store the shell
        super.init(splash);
            // Force shell to inherit the splash background
            getSplash().setBackgroundMode(SWT.INHERIT_DEFAULT); 
        // Load all splash extensions
        loadSplashExtensions();
        // If no splash extensions were loaded abort the splash handler
        if (hasSplashExtensions() == false) return;
        // Create UI
        createUI(splash);
    }

    private boolean hasSplashExtensions() {
        if (fImageList.isEmpty()) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public IProgressMonitor getBundleProgressMonitor() {
       return new NullProgressMonitor() {

          @Override
          public void beginTask(String name, final int totalWork) {
            getSplash().getDisplay().syncExec(new Runnable() {
              public void run() {
                  fBar.setSelection(50);
              }
            });
          }

          @Override
          public void subTask(String name) {
            getSplash().getDisplay().syncExec(new Runnable() {
              public void run() {
                  if (fBar.getSelection() < 100) fBar.setSelection(fBar.getSelection() + 10);
                  if (imageIdx >= fImageList.size()) imageIdx = 0;
                  Image image = fImageList.get(imageIdx++);
                  getSplash().setBackgroundImage(image);
                  getSplash().setRedraw(true);
                  getSplash().redraw();
              }
            });
          }
        };
    }

    private void createUI(Shell shell) {

        Composite container = new Composite(shell, SWT.NONE);
        container.setLayout(new GridLayout(1, false));
        container.setLocation(5, 374);
        container.setSize(480, 15);

        /* Progress Bar */
        fBar = new ProgressBar(container, SWT.HORIZONTAL);
        fBar.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        ((GridData) fBar.getLayoutData()).heightHint = 13;
        fBar.setMaximum(100);
        fBar.setSelection(25);

        /* Version Label */
        Label versionLabel = new Label(container, SWT.NONE);
        versionLabel.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
        //versionLabel.setFont(fVersionFont);
        //versionLabel.setForeground(fVersionColor);
        //versionLabel.setText(NLS.bind(Messages.SplashHandler_BUILD, "2.1 Nightly")); //$NON-NLS-1$

        /* Layout All */
        shell.layout(true, true);
    }   

    private void loadSplashExtensions() {
        // Get all splash handler extensions
        IExtension[] extensions = Platform.getExtensionRegistry()
                .getExtensionPoint(F_SPLASH_EXTENSION_ID).getExtensions();
        // Process all splash handler extensions
        for (int i = 0; i < extensions.length; i++) {
            processSplashExtension(extensions[i]);
        }
    }

    /**
     * Parse the extension points with the images filename.
     */
    private void processSplashExtension(IExtension extension) {
        // Get all splash handler configuration elements
        IConfigurationElement[] elements = extension.getConfigurationElements();
        // Process all splash handler configuration elements
        for (int j = 0; j < elements.length; j++) {
            processSplashElements(elements[j]);
        }
    }

    /**
     * Create the images defined as extension points
     */
    private void processSplashElements(IConfigurationElement configurationElement) {

        String name = configurationElement.getAttribute(F_ELEMENT_IMAGE);
        ImageDescriptor descriptor = Activator.getImageDescriptor("/"+name);
        if (descriptor != null) {
            Image image = descriptor.createImage();
            if (image !=null) {
                fImageList.add(image);
            }
        }
    }

    public void dispose() {
        super.dispose();
        // Check to see if any images were defined
        if ((fImageList == null) ||
                fImageList.isEmpty()) {
            return;
        }
        // Dispose of all the images
        Iterator<Image> iterator = fImageList.iterator();
        while (iterator.hasNext()) {
            Image image = iterator.next();
            image.dispose();
        }
    }
}

问题是进度条只能工作,而图像没有显示。在调试时,我可以验证图像是否确实找到并加载,并在 shell 中正确设置;外壳似乎没有被重新绘制。我错过了什么吗?=


我可以在 linux 和 windows 上解决这个问题,但它在 macos/cocoa 上不起作用(其中启动屏幕在每个图像幻灯片迭代中看起来“乱七八糟”)。

确实非常简单,只需在启动外壳和包含小部件的容器之间附加一个额外的 Composite 即可;然后更改新创建的容器对象上的背景图像。

private void createUI(Shell shell) {
    Composite bgcontainer = new Composite(shell, SWT.NONE); // new
    [...]
    Composite container = new Composite(bgcontainer, SWT.NONE);
    [...]
    fBar = new ProgressBar(container, SWT.HORIZONTAL);
    [...]
    Label versionLabel = new Label(container, SWT.NONE);
    versionLabel.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
    shell.layout(true, true);
}   

@Override public IProgressMonitor getBundleProgressMonitor() {
return new NullProgressMonitor() {
    @Override public void beginTask(String name, final int totalWork) {
        getSplash().getDisplay().syncExec(new Runnable() {
            public void run() {
                    if (fBar != null) fBar.setSelection(40);
                    Image image = fImageList.get(imageIdx++);
                    bgcontainer.setBackgroundImage(image);
                    bgcontainer.setRedraw(true);
                    bgcontainer.update();                 
                }
            });
        }

    @Override public void subTask(String name) {
        final String n = name;
        getSplash().getDisplay().syncExec(new Runnable() {
            String taskname = n;
            public void run() {
                    if (fBar != null && fBar.getSelection() < 100)
                        fBar.setSelection(fBar.getSelection() + 10);
                    if (fBar.getSelection() == 60 || fBar.getSelection() == 80) {
                        if (imageIdx >= fImageList.size()) imageIdx = 0;
                        Image image = fImageList.get(imageIdx++);
                        bgcontainer.setBackgroundImage(image);
                        bgcontainer.setRedraw(true);
                        bgcontainer.update();
                    }
                 }
             });
         }
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse RCP 应用程序 - 自定义启动屏幕 的相关文章

随机推荐

  • 支持 Hexagon Maps for .NET 的开源 2D 游戏引擎

    我找不到 2D 游戏引擎来为 net 创建六边形地图 我能找到的最好的是 Xconq http sourceforge net projects xconq http sourceforge net projects xconq 和pyga
  • “django.core.exceptions.ValidationError”错误

    我正在 Django 中编写一个简单的游戏 所有的事情都是正确的 但是突然 我遇到了以下错误 Django v 1 7 Python v 3 4 我不知道这些代码有什么问题 test alireza alireza test test1 p
  • 关于并发修改异常[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您能否告诉我 是否有任何方法可以在单
  • 由于 Google Analytics,PageSpeed Insights 99/100 - 如何缓存 GA?

    我正在努力使 PageSpeed 达到 100 100 而且我已经快到了 我正在尝试找到一个好的解决方案来缓存 Google Analytics 这是我收到的消息 利用浏览器缓存 在静态资源的 HTTP 标头中设置到期日期或最长期限会指示浏
  • 信标已注册,但响应表明 UID 错误

    我使用成功注册了一个信标谷歌邻近API https developers google com beacons proximity guides hl en但响应指示不同的 UID 请求网址https proximitybeacon goo
  • “foreach”并行循环返回 s

    我正在尝试并行处理多个列表项 我的目标是 根据每列的值运行一些标签函数 然后返回带有节点名称 列名称和处理后的标签的数据帧 使用普通的 for 循环 工作流程可以正常工作 但是 当我尝试在 foreach 循环中执行相同的操作时 返回的结果
  • 对于 Haskell 的 QuickCheck,什么是收缩?

    我正在学习 QuickCheck gt 2 6 的诀窍 但我不明白什么是心理医生 从看类型签名 http hackage haskell org packages archive QuickCheck 2 6 doc html Test Q
  • 如何在java中将方法调用作为后台进程

    在我的应用程序中 当用户登录时 我有这个逻辑 它将调用以下方法 并使用用户拥有的所有符号 public void sendSymbol String commaDelimitedSymbols try further logic catch
  • 将 Seq 与 Range 进行模式匹配

    考虑一段代码 def foo xs Seq Int xs match case Nil gt empty list case head Nil gt one element list case head tail gt s head is
  • 点 -> 像素 iText (im)精度

    好的 这是一些代码 pdfDocument is a com itextpdf text Document PdfPTable table new PdfPTable 1 PdfPCell cell new PdfPCell cell se
  • 库存推文、文本挖掘、表情符号错误

    我希望您能够协助进行文本挖掘练习 我对 AAPL 推文感兴趣 并且能够从 API 中提取 500 条推文 我自己克服了几个障碍 但最后一部分需要帮助 由于某种原因 tm 包没有删除停用词 您能看一下可能是什么问题吗 表情符号会引起问题吗 绘
  • 在 FragmentStatePagerAdapter 中保存状态和恢复状态

    我正在使用ViewPager with FragmentStatePageAdapter我的屏幕上有 5 个页面 其中有大量图像和视图 目前我有mViewPager setOffscreenPageLimit 1 所以只有当前 上一个和下一
  • 如何准备图像分类的训练数据

    我是机器学习新手 在图像分类方面遇到一些问题 使用简单的分类器技术 K 最近邻居 我试图区分猫和狗 到目前为止我的代码 import pandas as pd import numpy as np import seaborn as sns
  • alloc 和 init 他们实际做了什么

    有人可以向我解释一下 init 和 alloc 在 Obj C 中的作用吗 我正在阅读这本 obj c 书 其中给出了创建对象的示例 但它并没有真正详细介绍它的作用 alloc返回什么 init 返回什么 Animal k Animal a
  • Windows 卷曲批处理文件

    我想使用 Windows 批处理文件进行 mailgun 卷曲调用 由于Windows shell不支持多行 如何在Windows批处理文件中执行以下curl函数 curl s user api key xxxxxxxxxx https a
  • pandas 中任意列表的笛卡尔积[重复]

    这个问题在这里已经有答案了 给定任意数量的列表 我想生成一个 pandasDataFrame作为笛卡尔积 例如 给定 a 1 2 3 b val1 val2 c 100 101 我想最终得到一个DataFrame有柱子a b and c 以
  • & 运算符在函数指针赋值中可选

    在下面的代码中 mylog c include
  • 在 pandas 数据框中进行 groupby 后滚动前 3 个月的唯一计数

    以下是数据框 Date Name data 01 01 2017 Alpha A 02 01 2017 Alpha A 03 01 2017 Alpha B 01 01 2017 Beta A 01 20 2017 Beta D 03 01
  • 从 r 中的数据帧中删除每第 n 列

    我试图通过删除每第三列来减小数据框的大小 这是我的示例数据框 example data frame x c 1 2 3 4 y c 1 2 3 4 z c 1 2 3 4 w c 1 2 3 4 p c 1 2 3 4 q c 1 2 3
  • Eclipse RCP 应用程序 - 自定义启动屏幕

    我目前正在开发一个 Eclipse RCP 应用程序 在其中我尝试实现一个自定义启动屏幕处理程序 显示一个进度条 行为类似于您可以在 product 定义中定义的默认进度条 和多个循环背景图像 以这种方式编辑主应用程序插件的扩展后