Я пытаюсь создать инструмент мониторинга процессора в построителе сцен (FXML) и не могу обновить его использование процессора в метке FXML.Я могу заставить его распечатать использование процессора в начале, но это все.Вот что у меня так далеко.
Java-файл
package cpumonitorfxml;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.util.Duration;
public class CPUMonitorFXML extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
FXMLDocumentController start = new FXMLDocumentController();
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(100), (ActionEvent) -> {
double cpu = FXMLDocumentController.getCPUUsage();
System.out.println("CPU: " + cpu);
}));
timeline.setCycleCount(100);
timeline.play();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
FXMLDocument
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="301.0" prefWidth="206.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="cpumonitorfxml.FXMLDocumentController">
<children>
<Button fx:id="button" layoutX="34.0" layoutY="229.0" onAction="#handleButtonAction" prefHeight="25.0" prefWidth="69.0" text="Click Me!" />
<Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
<ImageView fitHeight="150.0" fitWidth="200.0" layoutX="28.0" layoutY="28.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@gauge.png" />
</image>
</ImageView>
</children>
</AnchorPane>
И FXMLDocumentController
package cpumonitorfxml;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.util.Duration;
public class FXMLDocumentController implements Initializable {
private Timeline timeline;
private KeyFrame keyFrame;
private final double tickTimeInSeconds = 0.01;
private double secondsElapsed = 0.0;
private final double angleDeltaPerSeconds = 6.0;
@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
label.setText("Hello World!");
}
public void FXMLDocumentController(){
timeline.play();
setupTimer();
}
public static double getCPUUsage() {
OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
double value = 0;
for (Method method : operatingSystemMXBean.getClass().getDeclaredMethods()) {
method.setAccessible(true);
if (method.getName().startsWith("getSystemCpuLoad")
&& Modifier.isPublic(method.getModifiers())) {
try {
value = (double) method.invoke(operatingSystemMXBean);
} catch (Exception e) {
value = 0;
}
return value;
}
}
return value;
}
public void setupTimer(){
if(isRunning()){
timeline.stop();
}
keyFrame = new KeyFrame(Duration.millis(tickTimeInSeconds * 1000),
(ActionEvent actionEvent) -> {
update();
});
timeline = new Timeline(keyFrame);
timeline.setCycleCount(Animation.INDEFINITE);
}
private void update(){
secondsElapsed += tickTimeInSeconds;
String str = Double.toString(getCPUUsage());
label.setText(str);
}
public boolean isRunning(){
if(timeline != null){
if(timeline.getStatus() == Animation.Status.RUNNING){
return true;
}
}
return false;
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
Я знаю, что это довольно грубо, я довольно новв FXML.Очевидно, что предстоит проделать много работы, но мое основное препятствие, которое нужно преодолеть, - это создание временной шкалы (?), Которая обновит использование процессора в качестве метки.Я создал очень похожую программу в JavaFX, и мне было намного легче с этим.