Обновление Javafx WebView только с помощью JavaScriptJAVA

Программисты JAVA общаются здесь
Anonymous
Обновление Javafx WebView только с помощью JavaScript

Сообщение Anonymous »

Я работаю над небольшим побочным проектом в Яве. Поскольку я хотел, чтобы это было просто, и вроде ретро/ностальгическое чувство, я использую Javafx для пользовательского интерфейса. Тем не менее, я думаю, что Javafx - это ужасная основа для создания графиков - поэтому я думал, что смогу использовать веб -просмотр и построить свой фронт с базовым HTML и JavaScript. Похоже, что до сих пор все работает нормально (мне удалось позвонить в свои контроллеры Java из JavaScript, нажав кнопки на WebView), однако пользовательский интерфейс не обновляется. Чтобы просто пройтись, я попытался получить некоторые данные в бэкэнд и обновить список на фронте с полученными результатами. Данные извлекаются правильно (так как они напечатаны на консоли из кода Java), но список просто не меняется.
Идеи о том, что может отсутствовать или если моя идея просто не сработает?

Код: Выделить всё

    public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage stage) {
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();

webEngine.setOnError(event -> LOGGER.warning("[Frontend] An error occured on the frontend: " + event.getMessage()));
File htmlFile = new File(getClass().getResource("/html/index.html").getFile());
webEngine.load(htmlFile.toURI().toString());
webEngine.setJavaScriptEnabled(true);

// Wait until WebView is fully loaded before injecting WeaknessController
webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
if (newState == javafx.concurrent.Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("fileController", FileController.getInstance());
window.setMember("weaknessController", WeaknessController.getInstance());
window.setMember("vulnerabilityController", VulnerabilityController.getInstance());
window.setMember("fileReader", FileReaderUtility.getInstance());

// TODO: remove later - just for debugging purposes
window.setMember("javaConsole", new JSConsoleBridge());
webEngine.executeScript("""
console.log = function(msg) {
javaConsole.log(msg);
};
console.error = function(msg) {
javaConsole.error(msg);
};
""");
}
});

StackPane root = new StackPane(webView);
Scene scene = new Scene(root, 1500, 900);
stage.setScene(scene);
stage.setTitle("Sage UI");
stage.getIcons().add(new Image(getClass().getResourceAsStream("/logos/taskbar_icon.png")));
stage.show();
}
< /code>
function processFile() {
let filePath = window.fileReader.getFilePath();
console.log("Processing file called");

if (filePath) {
const result = JSON.parse(window.fileController.process(filePath));
console.log(result)
displayStatistics(result);
} else {
console.log(filePath);
}
}

function displayStatistics(statistics) {
console.log(statistics);
let statisticsList = document.getElementById("statistics");
statisticsList.innerHTML = "";
statistics.forEach(severity => {
let li = document.createElement("li");
li.textContent = `${severity.key} ${severity.value}`
statisticsList.appendChild(li);
});
}

function fetchAllVulnerabilities() {
const vulnerabilities = JSON.parse(window.fileController.fetchAllVulnerabilities());
updateList(vulnerabilities);
}

function updateList(entities) {
console.log(entities);
let entityList = document.getElementById("list");
entityList.innerHTML = "";
entities.forEach(entity => {
let li = document.createElement("li");
li.textContent = `${entity.name}`;
entityList.appendChild(li);
});
}

function fetchWeakness(id) {
let list = document.getElementById("weaknessList");
const weakness = JSON.parse(window.weaknessController.fetchById(id));
// TODO: implement
}
< /code>






SAGE UI
[*]





SAGE
Dashboard


[list][/list]


[img]../icons/add-document.png[/img]
Select File


Fetch
Choose File

[list]
List Item 1
[*]List Item 2
[*]List Item 3
[*]List Item 4
[*]List Item 5
[*]List Item 7
[/list]

Vulnerabilities




< /code>
PS: calling processFile()
будет печатать «Файл обработки» с именем ", но не результат после const result = json.parse (window.filecontroller.process (filePath)); получается, хотя.
edit после @james_d 'sment:

Код: Выделить всё

class FileController {
private static FileController instance;
private static FileService fileService;
private static VulnerabilityService vulnerabilityService;

private FileController() {
fileService = new FileService();
vulnerabilityService = new VulnerabilityService();
}

public static FileController getInstance() {
if (instance == null)
instance = new FileController();
return instance;
}

public String process(String filePath) {
if (fileService.processFile(filePath))
return JsonParser.asJsonString(vulnerabilityService.getStatistics());
LOGGER.severe(String.format("[FileController] Failed to process SAST-Report-File: %s", filePath));
throw new InternalError("File: " + filePath + " could not be processed\n");
}
// ...
}
< /code>
I cant give you the whole implementation of what happens in the service class since this would just be too much here. But: basically, fileService.processFile(filePath)
создает объект файла и транслирует его контент в локальную базу данных H2. уязвимость service.getStatistics () Просто получает некоторые данные из этой базы данных и возвращает их.
Я предполагаю, что это связано с асинхроной, потому что процесс издевательства (FilePath) с возвращением твердых кодировки будет работать нормально, и пользовательский интерфейс обновляется. Javafx - Может ли это уже мой ответ или я должен посмотреть, как синхронизировать пользовательский интерфейс и основные темы?

Подробнее здесь: https://stackoverflow.com/questions/796 ... javascript

Вернуться в «JAVA»