【问题标题】:How do I create a 2nd splash screen for mid-program loading?如何为中间程序加载创建第二个启动画面?
【发布时间】:2013-10-15 17:58:15
【问题描述】:

我正在编写一个使用外部资源文件的 java swing 应用程序。
许多资源文件只需要加载某些选择。
进行选择后,第一个窗口关闭,加载适当的外部资源,并打开另一个窗口,其中包含这些资源。

第一个窗口有一个启动屏幕来覆盖加载时间。
我怎样才能让第二个窗口有类似的东西?
我所看到的涉及在同一个窗口中发生的任务,这对于该项目是不可行的,并且 Java 的内置启动屏幕不会第二次启动(SplashScreen.getSplashScreen 返回 null)。

【问题讨论】:

标签: java swing


【解决方案1】:

OtrosLogViewer 中,我显示在MANIFEST.MF 中定义的第一个初始屏幕。加载应用程序时,我会根据加载进度呈现新的启动画面。 OtrosSplah.java 正在调用方法 render 来重绘飞溅:

  private static void render() {
      SplashScreen splashScreen = SplashScreen.getSplashScreen();
      if (splashScreen == null) {
        return;
      }
      Graphics2D g = splashScreen.createGraphics();
      if (g == null) {
        return;
      }

      if (version == null) {
        try {
          version = VersionUtil.getRunningVersion();
        } catch (IOException e) {
          version = "?";
        }
        version = "Version: " + version;
      }

      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g.setComposite(AlphaComposite.Clear);
      Rectangle bounds = splashScreen.getBounds();
      g.fillRect(0, 0, bounds.width, bounds.height);
      g.setPaintMode();
      g.setColor(Color.BLACK);
      g.setFont(g.getFont().deriveFont(14f));
      g.drawString(message, 20, 110);
      g.drawString(version, 20, 130);
      splashScreen.update();
    }

你也可以这样做。显示来自 MANIFEST.MF 的第一个初始屏幕,然后绘制新屏幕。

【讨论】:

    【解决方案2】:

    您可以简单地为自己创建一个JWindow,而不是使用SplashScreen API。

    您可以在其中添加一堆组件来提供您需要的功能(即,JLabel 用于背景,JLabel 用于消息)并在加载资源时使其可见。

    完成后,您可以简单地处理窗口。

    另外,请确保您在后台线程中执行所有加载。 SwingWorker 很适合这个目的,恕我直言

    This answer演示概念,求第二个例子……

    【讨论】:

    • 感谢您的建议。您链接的答案不如使用 SwingWorker 的建议有用,但 SwingWorker 工作得很好。
    • 至少“某事”有所帮助;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多