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