java - 如何在每次遍历 for 循环时显示更新的 GUI(使用 Swingworker?)

标签 java swing user-interface swingworker

我想在每次进入 for 循环时更新我的​​ GUI,当我手动更新它时我可以更新我的 GUI,但在循环中它只显示最后一次更新。我听说过并读过有关 SwingWorker 的内容,但说实话我不太了解它,而且这些示例与我需要做的不同。

这是我的循环:

for(int i = 0; i < 3; i++){
        actionRoll();

    }

这是更新我的 GUI 的方法:

public static void actionRoll() {

    String uitkomst, dice1, dice2;
    int isHonderd, isMexico;

    // making instance of generator
    Generator generator = new Generator();

    //get info from generator
    uitkomst = generator.getResults();
    isHonderd = generator.getIfHunderd();
    isMexico = generator.getIfMexico();

    //split the result
    String[] parts = uitkomst.split("-");
    dice1 = parts[0];
    dice2 = parts[1];

    //setLeft Dice
    ImageIcon image = new ImageIcon("img/diceSurface/diceSurface0"+dice1+".png");
    ((IconPanel) pnDiceLeft).setImage(image);

    //setRightDice
    ImageIcon image1 = new ImageIcon("img/diceSurface/diceSurface0"+dice2+".png");
    ((IconPanel) pnDiceRight).setImage(image1);

    pnMainPanel.updateUI();
}

现在它只显示第三次,也就是最后一次循环,如何解决这个问题? 我考虑过 thread.sleep() 但它不起作用..

提前致谢!

最佳答案

假设您正在某个监听器/操作处理程序中执行循环,从而在更新 ui 的事件调度线程中执行循环。 这将导致 ui 更新停止,直到执行循环,因此您只能看到最后一次迭代。

正如您所说,使用 SwingWorker 应该有所帮助,因为循环将由不同的线程执行。

示例:

class ActionRollWorker extends SwingWorker<Void, String> {
  public StringdoInBackground() {
    for(int i = 0; i < 3; i++){
      // making instance of generator
      Generator generator = new Generator();

      //get info from generator
      String uitkomst = generator.getResults();
      int isHonderd = generator.getIfHunderd();
      int isMexico = generator.getIfMexico();

      publish(uitkomst);
    }
    return null;
  }

  protected void process( List<String> chunks )
  {
    for( String uitkomst : chunks )
    {
      String[] parts = uitkomst.split("-");
      String dice1 = parts[0];
      String dice2 = parts[1];

      //setLeft Dice
      ImageIcon image = new ImageIcon("img/diceSurface/diceSurface0"+dice1+".png");
      ((IconPanel) pnDiceLeft).setImage(image);

      //setRightDice
      ImageIcon image1 = new ImageIcon("img/diceSurface/diceSurface0"+dice2+".png");
      ((IconPanel) pnDiceRight).setImage(image1);
    }
  }

  protected void done() {
    //nothing
  }
}

这样调用它:

new ActionRollWorker().execute();

请注意,pnDiceLeft 等可能必须传递给工作人员,或者工作人员需要是内部类或匿名类才能访问这些变量,具体取决于它们的定义方式和位置.

另请注意,这是未经测试的代码,可能会缺少一些内容,但它应该可以帮助您入门。

关于java - 如何在每次遍历 for 循环时显示更新的 GUI(使用 Swingworker?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22323082/

相关文章:

java - 如何从 GitHub 远程运行 Android 应用程序?

java - 不同语言的服务器和客户端可以互相通信吗?

java - JTable 禁用列选择

java - JTable 工作但 JTable 子类不会

java - 页面转换器的 ViewPager 页面缩放问题

java - Jcombobox算法

java - 阻止一个 c 程序启动另一个程序

java - 如何设置自定义按钮的大小?

python - python GUI的问题

不使用 FXML 的 Stage 的 JavaFx USE_COMPUTED_SIZE