gpt4 book ai didi

JavaFX 线程卡住

转载 作者:行者123 更新时间:2023-12-01 17:30:29 25 4
gpt4 key购买 nike

我目前正在开发一个 JavaFX 项目。在 GUI 初始化时,我想使用 Selenium 和 FirefoxDriver 从 HTML 文档中读取一些信息。通常我会使用爬虫来获取信息,但这个文档充满了 JavaScript,所以我只能使用 Selenium 来获取信息(我知道,这真的很糟糕)。

现在我遇到了这个过程需要长达 15 秒的问题,我想在 JavaFX 进度条上显示 Selenium 的进度。因此,我设置了一个线程来完成所有工作并尝试更新 GUI,但线程会卡住,直到 Selenium 完成为止。

这是我的尝试:

public class SeleniumThread extends Thread
{
private MainViewController main;

@Override
public void run()
{
try
{
WebDriver driver = new FirefoxDriver();
driver.get("http://---.jsp");
main.getMain().getPrimaryStage().toFront();
main.getPbStart().setProgress(0.1);
WebElement query = driver.findElement(By.id("user"));
query.sendKeys(new String[] {"Username"});
query = driver.findElement(By.id("passwd"));
query.sendKeys(new String[] {"Password"});
query.submit();
driver.get("http://---.jsp");
main.getPbStart().setProgress(0.2);
sleep(1000);
main.getPbStart().setProgress(0.25);
driver.get("http://---.jsp");
main.getPbStart().setProgress(0.4);
sleep(1000);
main.getPbStart().setProgress(0.45);
driver.get("---.jsp");
main.getPbStart().setProgress(0.6);
sleep(1000);
main.getPbStart().setProgress(0.65);
query = driver.findElement(By.cssSelector("button.xyz"));
query.click();
sleep(1000);
main.getPbStart().setProgress(0.85);
System.out.println(driver.getPageSource());
driver.quit();
}
catch(InterruptedException e)
{
// Exception ...
}

}

public MainViewController getMain()
{
return main;
}

public void setMain(MainViewController main)
{
this.main = main;
}
}

主视图 Controller

public void startup()
{
if(main.getCc().getMjUsername() != null &&
main.getCc().getMjPassword() != null &&
main.getCc().getMjUsername().length() != 0 &&
main.getCc().getMjPassword().length() != 0)
{
SeleniumThread st = new SeleniumThread();
st.setMain(this);
st.setDaemon(true);
st.run();
}
}

我读到我应该使用类似任务的 Worker 来实现它,但我不知道如何实现它。我需要向这个任务传递一个参数,因为我需要将我的primaryStage设置到前面并更新进度条。

希望您能理解我的问题。我将非常感谢每一个帮助。

最佳答案

您正在尝试从不同的线程更新 UI。 UI 只能从 UI 线程更新。为此,请包装调用以更新进度:

Platform.runLater(() -> {main.getPbStart().setProgress(0.65);});

这会将 UI 的更新推送到 UI 线程中。

关于JavaFX 线程卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61131234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com