Java等待变量改变

时间:2014-12-08 14:04:28

标签: java javafx

我在这里遇到一个小问题,现在我一直在寻找任何灵魂的时间,但似乎找不到,我希望你能帮助我。

我有这些方法:

public String getInput(){
    //Wait here somehow
    return "Whatever to return";
}

public void keyTrigger(KeyEvent event){
    if(event.getCode().equals(KeyCode.ENTER)){
        String[] getInput = gameLog.getText().split("\n");
            input = getInput[getInput.length - 1]; //Input is a variable in the class
            //Tell the getInput() to continue from where i waited
    }
}

所以如果有人能告诉我第一种方法如何等待来自另一种方法的响应,我会非常高兴,因为到目前为止我没有尝试过这种做法

...编辑 对不起伙计们,我错过了一些细节。

第一:我正在开发JavaFX中的GUI,而gameLog变量是一个textarea,这就是为什么我要在换行符上拆分String。

第二:当我调用getInput()时,我希望它等待用户按Enter键,然后获取输入变量

3 个答案:

答案 0 :(得分:1)

您的即时请求将由CompletableFuture

满足
public String getInput(){
  final CompletableFuture<String> fut = new CompletableFuture<>();
  commonFuture = fut;
  return fut.join();
}

在上文中,您需要提供一个变量commonFuture,该变量可以从上面的代码和您的KeyEvent侦听器访问,并将作为这两段代码之间的联系点。在听众中你会说

commonFuture.complete(getInput[getInput.length - 1]);

此时join中的getInput()电话会完成,并返回此值。

但是,我建议您认真考虑当前的设计,这需要这种同步阻塞。您可以进行返工,以便在输入值可用时调用getInput替换为{{1}}。

答案 1 :(得分:0)

我真的不明白你的问题,从常见的逻辑我想你的getInput()应该从命令行读取并将值返回为String。您无需为其编写任何特殊代码,从命令行读取时应使用BufferedReader,请参阅下面的示例。

public String getInput(){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
try{
    line = reader.readLine();
    }catch(IOException e){
        e.printStackTrace();
        }
return line;
}

同样代码的这一部分,input = getInput[getInput.length - 1];我没有看到getInput.length - 1的一点,因为getInput()将返回一个完整的字符串,因此您不需要修剪它,除非您显然想要这样做。因此,您可以编写input = getInput();,并假设变量input的类型为String

答案 2 :(得分:0)

您应该使用StringProperty并使用它注册侦听器,而不是在变量发生变化之前尝试阻止。

这里有一些骨架代码:

private final StringProperty input = new SimpleStringProperty();

public StringProperty inputProperty() {
    return input ;
}

public final String getInput() {
    return inputProperty().get();
}

public final void setInput(String input) {
    inputProperty().set(input);
}

// event handler (I'm assuming):
public void keyTrigger(KeyEvent event){
    if(event.getCode().equals(KeyCode.ENTER)){
        String[] getInput = gameLog.getText().split("\n");
            inputProperty().set(getInput[getInput.length - 1]); 
    }
}

现在,您可以在更改input时执行代码:

inputProperty().addListener((obs, oldInput, newInput) -> {
    // newInput contains the new value set to the input property....
});

Properties and Bindings tutorial提供了有关使用JavaFX属性的更多详细信息。