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

nnsrf1az  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(338)

每次通过for循环时我都想更新gui,手动更新gui时我可以更新它,但在循环中它只显示最后一次更新。我听过也读过关于swingworker的文章,但老实说我不太懂,而且这些例子和我需要做的不一样。
这是我的循环:

  1. for(int i = 0; i < 3; i++){
  2. actionRoll();
  3. }

这是更新我的gui的方法:

  1. public static void actionRoll() {
  2. String uitkomst, dice1, dice2;
  3. int isHonderd, isMexico;
  4. // making instance of generator
  5. Generator generator = new Generator();
  6. //get info from generator
  7. uitkomst = generator.getResults();
  8. isHonderd = generator.getIfHunderd();
  9. isMexico = generator.getIfMexico();
  10. //split the result
  11. String[] parts = uitkomst.split("-");
  12. dice1 = parts[0];
  13. dice2 = parts[1];
  14. //setLeft Dice
  15. ImageIcon image = new ImageIcon("img/diceSurface/diceSurface0"+dice1+".png");
  16. ((IconPanel) pnDiceLeft).setImage(image);
  17. //setRightDice
  18. ImageIcon image1 = new ImageIcon("img/diceSurface/diceSurface0"+dice2+".png");
  19. ((IconPanel) pnDiceRight).setImage(image1);
  20. pnMainPanel.updateUI();
  21. }

现在它只显示循环的第三次,也就是最后一次,如何解决这个问题?我想到一个线程。sleep(),但它不起作用。。
提前谢谢!

2sbarzqh

2sbarzqh1#

假设您正在某个侦听器/操作处理程序中执行循环,从而在事件调度线程中执行循环,该线程将更新ui。这将导致ui更新暂停,直到循环被执行,因此您只能看到最后一次迭代。
正如您所说的,使用swingworker应该会有所帮助,因为循环将由不同的线程执行。
例子:

  1. class ActionRollWorker extends SwingWorker<Void, String> {
  2. public StringdoInBackground() {
  3. for(int i = 0; i < 3; i++){
  4. // making instance of generator
  5. Generator generator = new Generator();
  6. //get info from generator
  7. String uitkomst = generator.getResults();
  8. int isHonderd = generator.getIfHunderd();
  9. int isMexico = generator.getIfMexico();
  10. publish(uitkomst);
  11. }
  12. return null;
  13. }
  14. protected void process( List<String> chunks )
  15. {
  16. for( String uitkomst : chunks )
  17. {
  18. String[] parts = uitkomst.split("-");
  19. String dice1 = parts[0];
  20. String dice2 = parts[1];
  21. //setLeft Dice
  22. ImageIcon image = new ImageIcon("img/diceSurface/diceSurface0"+dice1+".png");
  23. ((IconPanel) pnDiceLeft).setImage(image);
  24. //setRightDice
  25. ImageIcon image1 = new ImageIcon("img/diceSurface/diceSurface0"+dice2+".png");
  26. ((IconPanel) pnDiceRight).setImage(image1);
  27. }
  28. }
  29. protected void done() {
  30. //nothing
  31. }
  32. }

可以这样称呼:

  1. new ActionRollWorker().execute();

请注意 pnDiceLeft etc可能必须传递给worker,或者worker需要是内部类或匿名类才能访问这些变量,这取决于它们的定义方式和位置。
还要注意的是,这是未经测试的代码,有些东西可能会丢失,但它应该让您开始。

展开查看全部

相关问题