【问题标题】:How to show the updated GUI each time a for loop is traversed (using Swingworker?)每次遍历 for 循环时如何显示更新的 GUI(使用 Swingworker?)
【发布时间】:2014-03-11 10:33:54
【问题描述】:

我想在每次通过 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() 进行了讨论,但它不起作用..

提前致谢!

【问题讨论】:

  • 请询问 pnMainPanel.updateUI(); 的原因是什么,因为此方法如果用于更改 LookAndFeel 或覆盖 JComponent 的自定义方法,但无法更改 JPanel 中的 ImageIcon
  • updateUI 是为了确保我更新的图片(部分透明)的背景正确显示,否则我的图片的透明背景中有奇怪的东西
  • 你没有提到你的目标,updateUI 是错误的通知器,甚至在一些奇怪的代码结构中对你有用 :-)

标签: java swing user-interface swingworker


【解决方案1】:

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

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

【讨论】:

  • 是的,我已经阅读过它,但无法弄清楚如何在我的代码中实现它..
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 2020-11-29
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多