运行过程时JFrame / JPanel不更新

时间:2019-02-10 19:12:33

标签: java swing jframe jpanel repaint

我正在运行int fork_process(Command_Group* cmd_group, int cmd_idx, int fd[2], int second_fd[2], char* position) { if (cmd_group == NULL) { perror("invalid null command passed to fork_process"); return -1; } Command* cmd = cmd_group->cmd_list[cmd_idx]; pid_t pid; if (strcmp(position, FIRST) == 0) { pipe(fd); } else if (strcmp(position, MIDDLE) == 0) { pipe(second_fd); } if ((pid = fork()) < 0) { perror("invalid fork command\n"); exit(EXIT_FAILURE); } else if (pid == 0) { // Child if (strcmp(position, FIRST) == 0) { if (dup2(fd[OUT], STDOUT_FILENO) < 0) { perror("invalid piping: dup2 failure"); return -1; } if (setpgid(pid, pid) < 0) { perror("invalid setpgid failure"); } } else if (strcmp(position, MIDDLE) == 0) { if (dup2(fd[IN], STDIN_FILENO) < 0 || dup2(second_fd[OUT], STDOUT_FILENO) < 0) { perror("invalid piping: dup2 failure"); return -1; } if (setpgid(pid, cmd_group->pgid) < 0) { perror("invalid setpgid failure"); } } else if (strcmp(position, FINAL) == 0) { if (dup2(fd[IN], STDIN_FILENO) < 0) { perror("invalid piping: dup2 failure"); return -1; } if (setpgid(pid, cmd_group->pgid) < 0) { perror("invalid setpgid failure"); } } close_pipes(cmd_group->pipe_fds, cmd_group->pipe_count); if (create_redirects(cmd) < 0) { perror("invalid redirection error"); return -1; } if (execvp(cmd->cmd, cmd->args) < 0) { perror("invalid: execvp failure"); return -1; } } // Parent if (strcmp(position, FIRST) == 0 || strcmp(position, ONLY) == 0) { setpgid(pid, pid); cmd_group->pgid = pid; } else { setpgid(pid, cmd_group->pgid); } cmd->pid = pid; return 0; } (用于FRC的gradew部署),并且将其输出定向到ProcessBufferedReader(在下面的块中JFrame)用于包含parentJPanel)的JTextArea的新窗口。最初,我有这种方法来更新文本区域,同时读取outputArea的输出:

Process

此实现在public void show(BufferedReader in){ outputArea.setText(""); while(true){ String line = in.readLine(); if(line == null){ break; } outputArea.append(line + "\n"); } parent.setTitle("Deploy Output"); } 运行时显示空白窗口,并且仅在完成后才更新为输出。
当前,要尝试对其进行更新,我在以下位置创建了Process和窗口,并创建了以下循环和后续方法:

Process
while(!outputWindow.getDone()){ //getDone returns done as set in the subsequent method
    outputWindow.show(br); //br = the BufferedReader
    outputWindow.repaint();
}

我尝试过的其他方法包括将public void show(BufferedReader in){ String line = in.readLine(); if(line == null){ parent.setTitle("Deploy Output"); done = true; return; } outputArea.append(line + "\n"); } SwingUtilities.invokeLater()一起使用,与repaint创建一个新线程,以及将repaintrevalidate一起使用。根据此版本的while循环的每次迭代期间进行的打印调试,表明它在更新之前就已获得输出,但是在repaint完成之后,它仅显示文本和框架的其他组成部分。
任何援助将不胜感激。

编辑(几乎忘了)-整个项目的Github存储库在这里,它具有方法的第一个版本:Github

0 个答案:

没有答案