首页 > 解决方案 > JFrame 中的组件不显示是否跟随启动进程

问题描述

我有以下代码(简化):

public class MyForm extends JFrame {
  private SplashForWaiting generating = new SplashForWaiting();
  private String texContent, batContent;

  // boilerplate code
  // ...

  private String insertFormValues(String template) {
    // modify String
  }

  private void buttonGenerateActionPerformed(ActionEvent evt) {
    generating.setVisible(true);
    Path texFile = Files.createTempFile(tmpDir,"test", ".tex");
    Path batFile = Files.createTempFile(tmpDir,"test", ".bat");
    OutputStreamWriter batWriter = new OutputStreamWriter(new FileOutputStream(batFile.toFile()), java.nio.charset.Charset.forName("IBM850"));
    batWriter.write(batContent.replace("¦filename",texFile.getFileName().toString()));
    batWriter.close();
    LinkedList<String> cmd = new LinkedList<>();
    cmd.add("explorer"); // cmd.exe is not directly accessible
    cmd.add(batFile.getFileName().toString());
    OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(texFile.toFile()), StandardCharsets.UTF_8);
    writer.write(insertFormValues(texContent));
    writer.close();
    ProcessBuilder pb = new ProcessBuilder(cmd);
    pb.directory(tmpDir.toFile());
    if (!debug || debugGenerate==true) {
      if (debug) System.out.print("Generating");
      Process p = pb.start();
      int exitval = p.waitFor();
      Path done = tmpDir.resolve("done.txt");
      do {
        if (debug) System.out.print(".");
        TimeUnit.SECONDS.sleep(2);
      } while (!Files.exists(done));
      Files.delete(done);
      generating.setVisible(false);
    }
  }
}

public class SplashForWaiting extends JFrame {
  private JLabel jLabel2 = new JLabel();
  private JPanel jPanel1 = new JPanel();
  public SplashForWaiting() {
    setTitle("Generating...");
    setAlwaysOnTop(true);
    setBounds(new Rectangle((Toolkit.getDefaultToolkit().getScreenSize().width-730)/2, (Toolkit.getDefaultToolkit().getScreenSize().height-312)/2, 730, 312));
    setIconImages(MyForm.icons);
    setMaximumSize(new Dimension(750, 312));
    setMinimumSize(new Dimension(750, 312));
    setResizable(false);
    //setUndecorated(true);
    getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS));

    jPanel1.setMaximumSize(new Dimension(750, 312));
    jPanel1.setMinimumSize(new Dimension(750, 312));
    jPanel1.setPreferredSize(new Dimension(750, 312));
    jPanel1.setLayout(new BoxLayout(jPanel1, BoxLayout.LINE_AXIS));

    jLabel2.setIcon(new ImageIcon(getClass().getResource("/generating.jpg")));
    jLabel2.setMaximumSize(new Dimension(750, 312));
    jLabel2.setMinimumSize(new Dimension(750, 312));
    jLabel2.setPreferredSize(new Dimension(750, 312));
    jPanel1.add(jLabel2);

    getContentPane().add(jPanel1);

    pack();
  }              
}

可以看出(虽然有点模糊)是创建了一个 Windows 批处理文件,以及一个要处理的文件,然后执行该批处理文件。当批处理运行时,启动画面之类的东西应该通知用户正在发生的事情。

问题如下:

标签: javaswingexecevent-dispatch-thread

解决方案


推荐阅读