2015-03-31 23 views
0

您是否知道如何等待用户在for循环中的输入?我不是指showAndWait()方法,因为我没有为用户打开一个新的对话阶段。例如,for循环的每一轮都应该等待用户在继续下一轮之前按下按钮。如何等待用户在JavaFX中的操作(在同一阶段)

这怎么可能?非常感谢!

UPDATE:

现在它来到了我的脑海里,它会用while(buttonNotPressed){}工作,但它是一个很好的解决方案呢?我的意思是while循环在这种情况下疯狂地运行,直到用户不会按下按钮。或者以类似的等待方式来做它的工作?

想象一下它作为一个会话: 用户开始与handleStart()会话你给用户5个问题,一个接一个。在每次迭代中,用户都可以回答即将到来的问题,他可以通过handleSaveButton()保存或提交答案。您可以根据需要处理答案,并继续进行下一次迭代。重点是迭代必须停止,直到保存按钮没有被按下。

+2

您可能会发现有用的信息在一个快速复习[事件驱动的编程(http://en.wikipedia.org/wiki/Event- driven_programming)。注意:在JavaFX中,用于处理事件的主循环位于底层系统中,您的应用程序永远不需要编写事件循环 - 您只需提供系统将在适当时调用的事件处理程序。 – jewelsea 2015-03-31 21:29:21

回答

2

不要这样做。与任何事件驱动的GUI工具包一样,FX工具包已经实现了一个循环,用于渲染场景图和处理每次迭代的用户输入。

只需用按钮注册一个侦听器,做任何你需要做的,当按下按钮:

button.setOnAction(event -> { 
    // your code here... 
}); 

如果你想行动来改变,只是改变了一些变量的状态每次执行动作:

private int round = 0 ; 

// ... 

button.setOnAction(event -> { 
    if (round < 5) { 
     System.out.println("Round "+round); 
     System.out.println("User's input: "+textArea.getText()); 
     round++ ; 
    } 
}); 
+0

谢谢我尝试一下! – user3435407 2015-03-31 17:23:44

+0

我想我误解了一些东西。我试过这个(请参阅更新),这不完全是我试图实现的。我的错误在哪里? – user3435407 2015-03-31 18:21:05

+0

您所有的循环都会设置事件处理程序五次。设置事件处理程序一次,以执行按下按钮时需要执行的逻辑。查看更新。 – 2015-03-31 18:39:10

1

我最近遇到了类似的问题,我想要的东西用一个区间来执行(如果那是你的意思),直到用户触发的事件。我发现3种方式来做到这一点:

UPDATE

您应该使用的停止/取消方法自定义可运行和定时器或其他线程仍然会运行,当您退出应用程序。时间线似乎是自己做的。

使用定时器:

Timer timer = new Timer(); 
TimerTask task = new TimerTask() { 
    @Override 
    public void run() { 
     System.out.println("Printed every second."); 
    } 
}; 
timer.scheduleAtFixedRate(task, 0, 1000); 
//timer.cancel(); 

有了时间表:

Timeline tl = new Timeline(new KeyFrame(Duration.millis(1000), e -> { 
    System.out.println("Timeline"); 
})); 

tl.setCycleCount(Timeline.INDEFINITE); 
tl.play(); 
//tl.stop(); 

或者使自己运行的类:

public class Runner implements Runnable { 
    private final Thread thread = new Thread(this); 
    private boolean run; 

    @Override 
    public void run() { 
     while(run) { 
      try { 
       System.out.println("Printed from loop"); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       run = false; 
      } 
     } 
    } 

    public void start() { 
     run = true; 
     thread.start(); 
    } 

    public void stop() { 
     if(run) { 
      thread.interrupt(); 
      System.out.print("Thread has stopped."); 
     } 
    } 
} 

然后当一个人点击fx。一个按钮的事件将停止使用James_D张贴的例子:

Button btn = new Button("Button"); 

btn.setOnAction(e -> { 
    timer.cancel(); 
    tl.stop(); 
    runner.stop(); 
}); 
+0

嗨,感谢您的回答,但它不是关于时间,但用户的互动 – user3435407 2015-04-01 02:30:13

+0

我虽然尝试 – user3435407 2015-04-01 11:53:46

相关问题