我有一个简单的JavaFX
GUI,可在单击按钮时触发后台任务。此任务使用其最新的进度消息连续更新TextArea。我已经在下面演示了如何解决此问题。当任务出错时会出现问题,并且需要用户决定如何进行。我的目标是通过用户选择“是”或“否”的警报来做出此决定。不过,我一直无法实现此功能。到目前为止,这是我尝试过的事情:
谢谢您的帮助!
使用EventHandler创建按钮:
private Button createButton() {
Button btn = new Button();
btn.setText("Run");
btn.setPrefWidth(100);
EventHandler<ActionEvent> buildWindow = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
TextArea output = buildCenterTextArea();
Task task = new Task<Void>() {
@Override public Void call() {
callScript(output); // Calls script
return null;
}
};
new Thread(task).start();
}
};
btn.setOnAction(buildWindow);
return btn;
}
private void buildCenterTextArea() {
// Builds a text area which the script updates with status
TextArea output = new TextArea();
output.setEditable(false);
this.borderpane.setCenter(output);
return output
}
在我的脚本中,通过执行以下操作更新文本:
output.setText(statusText+ "\n" + newStatus);
后台线程可以保持忙碌等待。这意味着您可以创建一个CompletableFuture
,用于Platform.runLater
创建警报并使用showAndWait将其显示,然后用结果填充未来。在后台线程上的此调用之后,使用来等待结果Future.get
。
以下示例生成0到9(含)之间的随机数,并在上打印0-8 TextArea
。9
是模拟错误,并且询问用户是否应该继续执行任务。
@Override
public void start(Stage stage) throws IOException {
TextArea ta = new TextArea();
Thread thread = new Thread(() -> {
Random rand = new Random();
while (true) {
int i = rand.nextInt(10);
if (i == 9) {
CompletableFuture<ButtonType> future = new CompletableFuture<>();
// ask for user input
Platform.runLater(() -> {
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setContentText("An error occured. Continue?");
future.complete(alert.showAndWait().orElse(ButtonType.CANCEL)); // publish result
});
try {
if (future.get() == ButtonType.CANCEL) { // wait for user input on background thread
break;
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
break;
}
} else {
Platform.runLater(() ->ta.appendText(Integer.toString(i) + "\n"));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
});
thread.setDaemon(true);
thread.start();
Scene scene = new Scene(new VBox(ta));
stage.setScene(scene);
stage.show();
}
我通过使用硒IDE创建了一个提示: 如何返回这段代码并在IDE中进一步使用它?例如将其写入特定的输入字段。 我只是希望代码等到它从提示中接收到返回值,然后使用该值将其插入到特定字段。
问题内容: 很长时间以来,我一直在使用python机器人来完成一些工作任务。除其他外,机器人必须通过身份验证窗口。 python程序中的代码如下: 但是昨天它抛出了这个错误: selenium.common.exceptions.WebDriverException:消息:不支持使用提示用户类型提示用户提示 我一直在搜索,但是我什至找不到关于这种异常以及如何处理该问题的结果。 有任何想法吗? 提前
问题内容: 是否可以根据MySQL中的查询结果设置用户变量? 我想要实现的是这样的事情(我们可以假设和都是唯一的): 请注意,我知道有可能,但我不希望使用嵌套查询。 问题答案: 是的,但是您需要将变量分配移至查询中: 测试用例: 结果: 请注意,对于,或可用作分配运算符。但是,在其他语句中,赋值运算符必须为并且不是,因为在非SET语句中将其视为比较运算符。 更新: 除了下面的评论,您还可以执行以下
我正在尝试允许用户搜索一个数据库和回显结果,事情是我想搜索多个表。我知道我可以从x1,x2中选择*,但是行的名称是其他的,所以当另一行是username2时,我不能回显$row['username']。也许,如果它是可能的,类似于if($row==whatever),idk。谢谢你的帮助。 编辑:找到了这样做的方法。类似这样的工作:
问题内容: 我一直在对此进行一些研究,但至少可以说我还是很困惑。 谁能给我一个何时使用以及何时使用的具体示例;?到底有什么区别?何时使用这些方法是否有黄金法则? 如果我错了,也可以纠正我,但是这两个“对象”不是在GUI主线程内(用于更新GUI)创建另一个线程的方法吗? 问题答案: 使用快速和简单的操作和复杂的和大的操作。 用例 用例中的任务示例 示例:为什么我们不能用于长计算(摘自以下参考资料)。