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

Java 如何在每次遍历for循环时显示更新的GUI(使用Swingworker?),java,swing,user-interface,swingworker,Java,Swing,User Interface,Swingworker,我想在每次通过for循环时更新我的GUI,我可以在手动更新GUI时更新它,但在循环中它只显示最后一次更新。我听说过也读过关于SwingWorker的书,但老实说,我不太了解它,而且这些例子与我需要做的不同 这是我的循环: for(int i = 0; i < 3; i++){ actionRoll(); } 现在它只显示了循环的第三次,也就是最后一次,如何解决这个问题? 我想到了一条线。睡眠()但它不起作用 提前谢谢 A假设您正在某个侦听器/操作处理程序中执行循

我想在每次通过for循环时更新我的GUI,我可以在手动更新GUI时更新它,但在循环中它只显示最后一次更新。我听说过也读过关于SwingWorker的书,但老实说,我不太了解它,而且这些例子与我需要做的不同

这是我的循环:

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

    }
现在它只显示了循环的第三次,也就是最后一次,如何解决这个问题? 我想到了一条线。睡眠()但它不起作用


提前谢谢

A假设您正在某个侦听器/操作处理程序中执行循环,从而在更新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
  }
}
请注意,
pnDiceLeft
等可能必须传递给worker,或者worker需要是内部或匿名类才能访问这些变量,具体取决于这些变量的定义方式和位置


还要注意的是,这是未经测试的代码,可能缺少一些内容,但应该让您开始使用。

请说明pnMainPanel.updateUI()的原因;,因为此方法如果用于更改LookAndFeel或重写JComponent的自定义方法,但与更改JPA中的ImageIcon无关更新UI用于确保正确显示我更新的图像(部分透明)的背景,否则,我的图片的透明背景中有奇怪的东西你没有提到你的目标,updateUI是错误的通知程序,甚至在一些奇怪的代码结构中为你工作:-)是的,我读过,但在我的代码中不知道如何实现它。。
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();