- Loading...
...
| Code Block | ||
|---|---|---|
| ||
#// Usage: jjs -fx filebrowser.js -- <start_dir>
// Uses -fx and javafx TreeView to visualize directories
if (!$OPTIONS._fx) {
print("Usage: jjs -fx filebrowser.js -- <start_dir>");
exit(1);
}
// Java classes used
var File = Java.type("java.io.File");
var Files = Java.type("java.nio.file.Files");
// check directory argument, if passed
var dir = arguments.length > 0? new File(arguments[0]) : new File(".");
if (! dir.isDirectory()) {
print(dir + " is not a directory!");
exit(2);
}
// JavaFX classes used
var FXCollections = Java.type("javafx.collections.FXCollections");
var Scene = Java.type("javafx.scene.Scene");
var TreeItem = Java.type("javafx.scene.control.TreeItem");
var TreeView = Java.type("javafx.scene.control.TreeView");
// create a subclass of JavaFX TreeItem class
var LazyTreeItem = Java.extend(TreeItem);
// lazily filling children of a directory LazyTreeItem
function buildChildren(dir) {
var children = FXCollections.observableArrayList();
var stream = Files.list(dir.toPath());
stream.forEach(function(path) {
var file = path.toFile();
var item = file.isDirectory()?
makeLazyTreeItem(file) : new TreeItem(file.name);
children.add(item);
});
stream.close();
return children;
}
// create an instance LazyTreeItem with override methods
function makeLazyTreeItem(dir) {
var item = new LazyTreeItem(dir.name) {
expanded: false,
isLeaf: function() false,
getChildren: function() {
if (! this.expanded) {
// call super class (TreeItem) method
Java.super(item).getChildren().setAll(buildChildren(dir));
this.expanded = true;
}
// call super class (TreeItem) method
return Java.super(item).getChildren();
}
}
return item;
}
// JavaFX start method
function start(stage) {
stage.title = dir.absolutePath;
var rootItem = makeLazyTreeItem(dir);
rootItem.expanded = true;
var tree = new TreeView(rootItem);
stage.scene = new Scene(tree, 300, 450);
stage.show();
} |
Anchor Java_synchronized Java_synchronized
Java.synchronized function
Returns synchronized wrapper version of the given ECMAScript function.
| Code Block | ||||
|---|---|---|---|---|
| ||||
var Thread = Java.type("java.lang.Thread");
var sum = 0;
var lock = {};
function run() {
Thread.sleep(Math.floor(Math.random()*700) + 300);
// create synchronized wrapper of given function
// and use the second param as the synchronization lock
Java.synchronized(function() sum++, lock)();
}
var threads = [];
for (var i = 0; i < 4; i++) {
var t = new Thread(run);
threads.push(t);
t.start();
}
for (var i in threads) {
threads[i].join();
}
// always prints 4
print(sum); |
...