Sun憑借JavaFX介入富互聯(lián)網(wǎng)應用領(lǐng)域,向Adobe的Flex和 Microsoft的Silverlight宣戰(zhàn)。它的目標在于為創(chuàng)建橫跨桌面、互 聯(lián)網(wǎng)和移動設(shè)備的富互聯(lián)網(wǎng)應用提供一個基礎(chǔ)平臺,這也可以看出Sun的Java系列產(chǎn)品的一個重大轉(zhuǎn)變,它不再僅僅專注于底層技術(shù),而是開始創(chuàng)建完整的解 決方案。
目前的技術(shù)預覽版包括兩個主要組件:
關(guān)注于設(shè)計人員/開發(fā)人員工作流的Nile項目和JavaFX Script——一個編寫Java GUI應用的新型說明性語言(declarative language)。
實現(xiàn)功能:
1、監(jiān)控遠程機器(用到ganymed-ssh2-build210.jar包)。
2、實時顯示cpu使用情況(包括系統(tǒng)進程使用cpu、用戶進程使用cpu以及空閑進程使用cpu)。
3、實時系統(tǒng)內(nèi)存使用情況(包括系統(tǒng)已使用內(nèi)存以及空閑內(nèi)存)。
先看效果圖:
接口設(shè)計: 1、UpdateListener接口,用于實時更新數(shù)據(jù)
public interface UpdateListener {
public void updateCPU(String user, String sys, String idle);
public void updateMemory(String used, String free);
}
參考實現(xiàn): 定義FX圖表變量: LineChart cpuLineChart; LineChart memLineChart; 定義監(jiān)控數(shù)據(jù)存儲變量: ObservableList<LineChart.Series> cpuLineChartSeries = FXCollections .observableArrayList(); ObservableList<LineChart.Series> memLineChartSeries = FXCollections .observableArrayList(); 核心代碼:
@Override
public void updateCPU(String user, String sys, String idle) {
cpuLineChartSeries.get(0).getData()
.add(new LineChart.Data(cpuIndex, Float
.parseFloat(user)));
cpuLineChartSeries.get(1).getData()
.add(new LineChart.Data(cpuIndex, Float
.parseFloat(sys)));
cpuLineChartSeries.get(2).getData()
.add(new LineChart.Data(cpuIndex, Float
.parseFloat(idle)));
NumberAxis xAxis = (NumberAxis) cpuLineChart.getXAxis();
if (cpuIndex < xAxis.getUpperBound()) {
cpuIndex += 1;
} else {
xAxis.setLowerBound(xAxis.getLowerBound() + 1);
xAxis.setUpperBound(xAxis.getUpperBound() + 1);
cpuLineChartSeries.get(0).getData().remove(0);
cpuLineChartSeries.get(1).getData().remove(0);
cpuLineChartSeries.get(2).getData().remove(0);
}
}
@Override
public void updateMemory(String used, String free) {
memLineChartSeries.get(0).getData()
.add(new LineChart.Data(memIndex, Float
.parseFloat(used) / 1024.0));
memLineChartSeries.get(1).getData()
.add(new LineChart.Data(memIndex, Float
.parseFloat(free) / 1024.0));
NumberAxis xAxis = (NumberAxis) memLineChart.getXAxis();
if (memIndex < xAxis.getUpperBound()) {
memIndex += 1;
} else {
xAxis.setLowerBound(xAxis.getLowerBound() + 1);
xAxis.setUpperBound(xAxis.getUpperBound() + 1);
memLineChartSeries.get(0).getData().remove(0);
memLineChartSeries.get(1).getData().remove(0);
}
}
2、數(shù)據(jù)解析接口
public interface DataParser {
public String[] getCPUData(String line);
public String[] getMemoryData(String line);
public boolean isCPULine(String line);
public boolean isMemoryLine(String line);
}
Linux下數(shù)據(jù)解析參考實現(xiàn):
public String[] getCPUData(String line) {
String cpuStr = line.substring(line.indexOf("Cpu(s): ") + 8);
int indexOfUser = cpuStr.indexOf("%us,");
String user = cpuStr.substring(0, indexOfUser).trim();
int indexOfSys = cpuStr.indexOf("%sy,");
String sys = cpuStr.substring(indexOfUser + 5, indexOfSys).trim();
int indexOfIdle = cpuStr.indexOf("%id,");
int indexOfNi = cpuStr.indexOf("%ni,");
String idle = cpuStr.substring(indexOfNi + 5, indexOfIdle).trim();
return new String[] { user, sys, idle };
}
public String[] getMemoryData(String line) {
String memStr = line.substring(line.indexOf("total, ") + 7);
int indexOfUsed = memStr.indexOf("k used,");
String used = memStr.substring(0, indexOfUsed).trim();
double usedN = Double.parseDouble(used);
used = "" + (usedN / 1024.0);
int indexOfFree = memStr.indexOf("k free,");
String free = "0.5";
if (indexOfFree >= 0) {
free = memStr.substring(indexOfUsed + 7, indexOfFree).trim();
double freeN = Double.parseDouble(free);
free = "" + (freeN / 1024.0);
}
return new String[] { used, free };
}
源碼地址: