Please notice that this example aim to show data in chart form, not the actual presentation of memory allocation; for example, memFree should be a sub-set of memFree, not anoth section as shown on the piechart.
package javafx_meminfo; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Stream; import javafx.application.Application; import javafx.beans.property.SimpleFloatProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.chart.PieChart; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.StackPane; import javafx.stage.Stage; /** * * @web http://java-buddy.blogspot.com/ */ public class JavaFX_meminfo extends Application { final static String FILE_MEMINFO = "/proc/meminfo"; private final TableView<Record> tableMem = new TableView<>(); ObservableList<Record> listRecords = FXCollections.observableArrayList(); ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(); PieChart chart = new PieChart(pieChartData); @Override public void start(Stage primaryStage) { prepareMemInfo(); tableMem.setEditable(false); TableColumn colMemField = new TableColumn("Field"); colMemField.setMinWidth(150); colMemField.setCellValueFactory( new PropertyValueFactory<>("memField")); TableColumn colMemValue = new TableColumn("Value"); colMemValue.setMinWidth(100); colMemValue.setCellValueFactory( new PropertyValueFactory<>("memValue")); TableColumn colMemUnit = new TableColumn("Unit"); colMemUnit.setMinWidth(50); colMemUnit.setCellValueFactory( new PropertyValueFactory<>("memUnit")); TableColumn colMemQty = new TableColumn("Qty"); colMemQty.setMinWidth(200); colMemQty.setCellValueFactory( new PropertyValueFactory<>("memQty")); tableMem.setItems(listRecords); tableMem.getColumns().addAll(colMemField, colMemValue, colMemUnit, colMemQty); StackPane root = new StackPane(); root.getChildren().add(tableMem); Scene scene = new Scene(root, 500, 250); primaryStage.setTitle("java-buddy"); primaryStage.setScene(scene); primaryStage.show(); //Open second window chart.setTitle(FILE_MEMINFO); StackPane secondaryLayout = new StackPane(); secondaryLayout.getChildren().add(chart); Scene secondScene = new Scene(secondaryLayout, 400, 300); Stage secondStage = new Stage(); secondStage.setTitle("Second Stage"); secondStage.setScene(secondScene); //Set position of second window, related to primary window. secondStage.setX(primaryStage.getX() + 250); secondStage.setY(primaryStage.getY() + 100); secondStage.show(); } public static void main(String[] args) { launch(args); } private void prepareMemInfo() { Stream<String> streamMemInfo = readFile(FILE_MEMINFO); streamMemInfo.forEach((line) -> { System.out.println(line); //split one line by whitespace/grouped whitespaces String[] oneLine = line.split("\\s+"); for (String ele : oneLine) { System.out.println(ele); } System.out.println("---"); String rField = ""; int rMemValue = 0; String rMemUnit = ""; if (oneLine.length <= 3) { if (oneLine.length == 3) { rField = oneLine[0]; rMemValue = Integer.parseInt(oneLine[1]); rMemUnit = oneLine[2]; } else if (oneLine.length == 2) { rField = oneLine[0]; rMemValue = Integer.parseInt(oneLine[1]); rMemUnit = "B"; } else if (oneLine.length == 1) { rField = oneLine[0]; rMemValue = 0; rMemUnit = "B"; } Record record = new Record( rField, rMemValue, rMemUnit); listRecords.add(record); pieChartData.add(new PieChart.Data( record.getMemField(), record.getMemQty())); } }); } private Stream<String> readFile(String filePath) { Path path = Paths.get(FILE_MEMINFO); Stream<String> fileLines = null; try { fileLines = Files.lines(path); } catch (IOException ex) { Logger.getLogger(JavaFX_meminfo.class.getName()).log(Level.SEVERE, null, ex); } return fileLines; } public static class Record { private final SimpleStringProperty memField; private final SimpleIntegerProperty memValue; private final SimpleStringProperty memUnit; private final SimpleFloatProperty memQty; private Record(String memField, int memValue, String memUnit) { this.memField = new SimpleStringProperty(memField); this.memValue = new SimpleIntegerProperty(memValue); this.memUnit = new SimpleStringProperty(memUnit); if (memValue == 0) { this.memQty = new SimpleFloatProperty(0.0f); } else if (memUnit.equalsIgnoreCase("MB")) { this.memQty = new SimpleFloatProperty((float)memValue * 1000000.0f); } else if (memUnit.equalsIgnoreCase("kB")) { this.memQty = new SimpleFloatProperty((float)memValue * 1000.0f); }else { this.memQty = new SimpleFloatProperty((float)memValue); } } public String getMemField() { return memField.get(); } public int getMemValue() { return memValue.get(); } public String getMemUnit() { return memUnit.get(); } public float getMemQty() { return memQty.get(); } } }
No comments:
Post a Comment