我在这里遇到一个小问题,现在我一直在寻找任何灵魂的时间,但似乎找不到,我希望你能帮助我。
我有这些方法:
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键,然后获取输入变量
答案 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属性的更多详细信息。