Showing posts with label JavaFX. Show all posts
Showing posts with label JavaFX. Show all posts

Saturday, October 19, 2013

Decompress files from .zip using java.util.zip

Example to decompress multi files from .zip using java.util.zip, with JavaFX UI.

Decompress files from .zip using java.util.zip
Decompress files from .zip using java.util.zip

package javafx_zip;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Zip extends Application {

File fileSrc;
private static final int bufferSize = 8192;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");

final Label labelFile = new Label();

Button btn = new Button();
btn.setText("Open FileChooser'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {

FileChooser fileChooser = new FileChooser();

//Set extension filter
FileChooser.ExtensionFilter extFilter =
new FileChooser.ExtensionFilter("Zip files (*.zip)", "*.zip");
fileChooser.getExtensionFilters().add(extFilter);
File fileSrc = fileChooser.showOpenDialog(null);

String source = fileSrc.getPath();
String targetUnZipPath = fileSrc.getParent();

try {
//Compress file
FileInputStream fileInputStream =
new FileInputStream(source);
BufferedInputStream bufferedInputStream =
new BufferedInputStream(fileInputStream);
ZipInputStream zipInputStream =
new ZipInputStream(bufferedInputStream);

ZipEntry zipEntry;

String unzippedMsg = "";

while ((zipEntry = zipInputStream.getNextEntry()) != null) {
try {
byte[] buffer = new byte[bufferSize];
String unzippedFile = targetUnZipPath + "/" + zipEntry.getName();
FileOutputStream fileOutputStream =
new FileOutputStream(unzippedFile);
int size;
while ((size = zipInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, size);
}
fileOutputStream.flush();
fileOutputStream.close();
unzippedMsg += unzippedFile + "\n";
} catch (Exception ex) {
}
}
zipInputStream.close();
labelFile.setText("Unzipped files: \n" + unzippedMsg);
} catch (IOException ex) {
Logger.getLogger(JavaFX_Zip.class.getName()).log(Level.SEVERE, null, ex);
}
}
});

VBox vBox = new VBox();
vBox.getChildren().addAll(btn, labelFile);

StackPane root = new StackPane();
root.getChildren().add(vBox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

Wednesday, October 16, 2013

Compress multi files to .zip

Compress multi files to .zip
Compress multi files to .zip


package javafx_zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Zip extends Application {

File fileSrc;
private static final int bufferSize = 8192;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");

final Label labelFile = new Label();

Button btn = new Button();
btn.setText("Open FileChooser'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {

FileChooser fileChooser = new FileChooser();

//Set extension filter
FileChooser.ExtensionFilter extFilter =
new FileChooser.ExtensionFilter("files (*.*)", "*.*");
fileChooser.getExtensionFilters().add(extFilter);
List<File> fileSrcList = fileChooser.showOpenMultipleDialog(null);

String targetZipFile = fileSrcList.get(0).getParent() + "/compressed.zip";

try {
//Compress file
ZipOutputStream zipOutputStream;

FileOutputStream fileOutputStream =
new FileOutputStream(targetZipFile);
zipOutputStream = new ZipOutputStream(fileOutputStream);

for (File f : fileSrcList) {
String source = f.getPath();
String entryName = f.getName();

ZipEntry zipEntry = new ZipEntry(entryName);
zipOutputStream.putNextEntry(zipEntry);

byte[] buffer = new byte[bufferSize];
try (FileInputStream fileInputStream = new FileInputStream(source)) {
int numberOfByte;

while ((numberOfByte = fileInputStream.read(buffer, 0, bufferSize))
!= -1) {
zipOutputStream.write(buffer, 0, numberOfByte);
}
}
}
zipOutputStream.close();
labelFile.setText("Compressed file saved as: " + targetZipFile);
} catch (IOException ex) {
Logger.getLogger(JavaFX_Zip.class.getName()).log(Level.SEVERE, null, ex);
}
}
});

VBox vBox = new VBox();
vBox.getChildren().addAll(labelFile, btn);

StackPane root = new StackPane();
root.getChildren().add(vBox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


Monday, October 14, 2013

Decompress file (.gz) using java.util.zip, with JavaFX interface

Example to decompress .gz archives using Package java.util.zip, JavaFX File Chooser.

package javafx_zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Zip extends Application {

File fileSrc;
private static final int bufferSize = 8192;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");

final Label labelFile = new Label();

Button btn = new Button();
btn.setText("Open FileChooser'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {

FileChooser fileChooser = new FileChooser();

//Set extension filter
FileChooser.ExtensionFilter extFilter =
new FileChooser.ExtensionFilter("gz files (*.gz)", "*.gz");
fileChooser.getExtensionFilters().add(extFilter);

//Show open file dialog
fileSrc = fileChooser.showOpenDialog(null);

String source = fileSrc.getPath();
//remove ".gz" from the path
String targetUnGzFile = source.substring(0, source.length()-3);

try {
//UnCompress file

GZIPInputStream gZIPInputStream;

FileInputStream fileInputStream =
new FileInputStream(source);
gZIPInputStream = new GZIPInputStream(fileInputStream);

byte[] buffer = new byte[bufferSize];
try (FileOutputStream fileOutputStream = new FileOutputStream(targetUnGzFile)) {
int numberOfByte;

while((numberOfByte = gZIPInputStream.read(buffer, 0, bufferSize))
!= -1){
fileOutputStream.write(buffer, 0, numberOfByte);
}

fileOutputStream.close();
}

labelFile.setText("UnCompressed file saved as: " + targetUnGzFile);

} catch (IOException ex) {
Logger.getLogger(JavaFX_Zip.class.getName()).log(Level.SEVERE, null, ex);
}
}
});

VBox vBox = new VBox();
vBox.getChildren().addAll(labelFile, btn);

StackPane root = new StackPane();
root.getChildren().add(vBox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


Decompress file (.gz) using java.util.zip, with JavaFX interface
Decompress file (.gz) using java.util.zip, with JavaFX interface


Related: Compress file (.gz) using java.util.zip, with JavaFX interface

Sunday, October 13, 2013

Compress file (.gz) using java.util.zip, with JavaFX interface

The Package java.util.zip provides classes for reading and writing the standard ZIP and GZIP file formats. This example demonstrate how to open file with JavaFX FileChooser, and compress to .gz file with java.util.zip.GZIPOutputStream.

package javafx_zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPOutputStream;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Zip extends Application {

File fileSrc;
private static final int bufferSize = 8192;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");

final Label labelFile = new Label();

Button btn = new Button();
btn.setText("Open FileChooser'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {

FileChooser fileChooser = new FileChooser();

//Set extension filter
FileChooser.ExtensionFilter extFilter =
new FileChooser.ExtensionFilter("files (*.*)", "*.*");
fileChooser.getExtensionFilters().add(extFilter);

//Show open file dialog
fileSrc = fileChooser.showOpenDialog(null);

String source = fileSrc.getPath();
String targetZipFile = source + ".gz";

try {
//Compress file

GZIPOutputStream gZIPOutputStream;

FileOutputStream fileOutputStream =
new FileOutputStream(targetZipFile);
gZIPOutputStream = new GZIPOutputStream(fileOutputStream);

byte[] buffer = new byte[bufferSize];
try (FileInputStream fileInputStream = new FileInputStream(source)) {
int numberOfByte;

while((numberOfByte = fileInputStream.read(buffer, 0, bufferSize))
!= -1){
gZIPOutputStream.write(buffer, 0, numberOfByte);
}
}
gZIPOutputStream.close();

labelFile.setText("Compressed file saved as: " + targetZipFile);

} catch (IOException ex) {
Logger.getLogger(JavaFX_Zip.class.getName()).log(Level.SEVERE, null, ex);
}

}
});

VBox vBox = new VBox();
vBox.getChildren().addAll(labelFile, btn);

StackPane root = new StackPane();
root.getChildren().add(vBox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


Compress file using java.util.zip, with JavaFX interface
Compress file using java.util.zip, with JavaFX interface


Related: Decompress file (.gz) using java.util.zip, with JavaFX interface

Thursday, October 10, 2013

Intro to JavaFX on Raspberry Pi

Product Manager Bruno Borges explains how to use JavaFX with the Raspberry Pi. This presentation was given during the Java Embedded challenge at JavaOne 2013.

Part I


Part II


Sunday, September 22, 2013

Getting Started with JavaFX 3D Graphics

The tutorial, Getting Started with JavaFX 3D Graphics, contains information about the JavaFX 3D graphics functionality available in JavaFX 8.

- Overview
- 3D Shapes
- Camera
- Subscene
- Lights
- Materials
- Picking
- Building a 3D Sample Application

It is assumed that you have an intermediate level of Java and JavaFX knowledge. Download JDK 8 Developer Preview release from http://jdk8.java.net/download.html.

Wednesday, September 18, 2013

JavaFX BoxBlur effect

javafx.scene.effect.BoxBlur using a simple box filter kernel, with separately configurable sizes in both dimensions. And also an iteration parameter that controls the quality of the resulting blur.

BoxBlur effect
BoxBlur effect

package javafx_boxblur;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.SliderBuilder;
import javafx.scene.control.Tooltip;
import javafx.scene.effect.BoxBlur;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_BoxBlur extends Application {

@Override
public void start(Stage primaryStage) {
Image image = new Image("http://goo.gl/kYEQl");
ImageView imageView = new ImageView();
imageView.setImage(image);
Label label = new Label("Java-buddy");
HBox hBox = new HBox();
hBox.getChildren().addAll(imageView, label);

final BoxBlur boxBlur = new BoxBlur();
hBox.setEffect(boxBlur);

Slider sliderWidth = SliderBuilder.create()
.layoutX(50)
.layoutY(50)
.prefWidth(400)
.min(0)
.max(255)
.majorTickUnit(20)
.minorTickCount(3)
.showTickMarks(true)
.showTickLabels(true)
.value(5)
.tooltip(new Tooltip("BoxBlur.width"))
.build();
sliderWidth.valueProperty().addListener(new ChangeListener<Number>() {

@Override
public void changed(ObservableValue<? extends Number> ov,
Number t, Number t1) {
boxBlur.setWidth(t1.doubleValue());
}
});

Slider sliderHeight = SliderBuilder.create()
.layoutX(50)
.layoutY(50)
.prefWidth(400)
.min(0)
.max(255)
.majorTickUnit(20)
.minorTickCount(3)
.showTickMarks(true)
.showTickLabels(true)
.value(5)
.tooltip(new Tooltip("BoxBlur.height"))
.build();
sliderHeight.valueProperty().addListener(new ChangeListener<Number>() {

@Override
public void changed(ObservableValue<? extends Number> ov,
Number t, Number t1) {
boxBlur.setHeight(t1.doubleValue());
}
});

VBox vBox = new VBox();
vBox.getChildren().addAll(hBox, sliderWidth, sliderHeight);

StackPane root = new StackPane();
root.getChildren().add(vBox);
Scene scene = new Scene(root, 300, 300);
primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

Saturday, September 7, 2013

JavaFX photo application demo

JavaFX photo application created by Felipe Pedroso


Detect mouse events on JavaFX Charts

This example demonstrate how to detect mouse events on JavaFX Charts.

Detect mouse events on JavaFX Charts
Detect mouse events on JavaFX Charts


package javafx_charts;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Charts extends Application {

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("java-buddy.blogspot.com");
Group root = new Group();

final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();

xAxis.setLabel("Month");
yAxis.setLabel("Value");

final AreaChart<String,Number> areaChart = new AreaChart<>(xAxis,yAxis);

areaChart.setTitle("AreaChart");

//Series 1
XYChart.Series series1 = new XYChart.Series();
series1.setName("XYChart.Series 1");

series1.getData().add(new XYChart.Data("January", 100));
series1.getData().add(new XYChart.Data("February", 200));
series1.getData().add(new XYChart.Data("March", 50));
series1.getData().add(new XYChart.Data("April", 75));
series1.getData().add(new XYChart.Data("May", 110));
series1.getData().add(new XYChart.Data("June", 300));
series1.getData().add(new XYChart.Data("July", 111));
series1.getData().add(new XYChart.Data("August", 30));
series1.getData().add(new XYChart.Data("September", 75));
series1.getData().add(new XYChart.Data("October", 55));
series1.getData().add(new XYChart.Data("November", 225));
series1.getData().add(new XYChart.Data("December", 99));

//Series 2
XYChart.Series series2 = new XYChart.Series();
series2.setName("XYChart.Series 2");

series2.getData().add(new XYChart.Data("January", 150));
series2.getData().add(new XYChart.Data("February", 100));
series2.getData().add(new XYChart.Data("March", 60));
series2.getData().add(new XYChart.Data("April", 40));
series2.getData().add(new XYChart.Data("May", 30));
series2.getData().add(new XYChart.Data("June", 100));
series2.getData().add(new XYChart.Data("July", 100));
series2.getData().add(new XYChart.Data("August", 10));
series2.getData().add(new XYChart.Data("September", 175));
series2.getData().add(new XYChart.Data("October", 155));
series2.getData().add(new XYChart.Data("November", 125));
series2.getData().add(new XYChart.Data("December", 150));

areaChart.getData().addAll(series1, series2);

setOnMouseEventsOnSeries(series1.getNode(),
areaChart, "Series 1 clicked");
setOnMouseEventsOnSeries(series2.getNode(),
areaChart, "Series 2 clicked");

root.getChildren().addAll(areaChart);
primaryStage.setScene(new Scene(root, 500, 400));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}

private void setOnMouseEventsOnSeries(Node node,
final AreaChart chart, final String label) {

node.setOnMouseClicked(new EventHandler<MouseEvent>() {

@Override
public void handle(MouseEvent t) {
chart.setTitle(label);
}
});

}

}



Wednesday, September 4, 2013

Apply custom style on AreaChart

The post "Area Chart with two series of data" use default style of AreaChart. By applying CSS, you can define your own style on chart.

AreaChart with custom style
AreaChart with custom style

Create chartStyle.css in the same folder of the main java, define style of the AreaChart.
.default-color0.chart-area-symbol { -fx-background-color: #FFFFFFFF, #FFFFFFFF; }
.default-color1.chart-area-symbol { -fx-background-color: #00000000, #00000000; }

.default-color0.chart-series-area-line { -fx-stroke: #FF0000; }
.default-color1.chart-series-area-line { -fx-stroke: #0000FF; }

.default-color0.chart-series-area-fill { -fx-fill: #00FF00; }
.default-color1.chart-series-area-fill { -fx-fill: #00000000; }


Main java code.
package javafx_charts;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Charts extends Application {

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("java-buddy.blogspot.com");
Group root = new Group();

final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();

xAxis.setLabel("Month");
yAxis.setLabel("Value");

final AreaChart<String,Number> areaChart = new AreaChart<>(xAxis,yAxis);

areaChart.setTitle("AreaChart");

//Series 1
XYChart.Series series1 = new XYChart.Series();
series1.setName("XYChart.Series 1");

series1.getData().add(new XYChart.Data("January", 100));
series1.getData().add(new XYChart.Data("February", 200));
series1.getData().add(new XYChart.Data("March", 50));
series1.getData().add(new XYChart.Data("April", 75));
series1.getData().add(new XYChart.Data("May", 110));
series1.getData().add(new XYChart.Data("June", 300));
series1.getData().add(new XYChart.Data("July", 111));
series1.getData().add(new XYChart.Data("August", 30));
series1.getData().add(new XYChart.Data("September", 75));
series1.getData().add(new XYChart.Data("October", 55));
series1.getData().add(new XYChart.Data("November", 225));
series1.getData().add(new XYChart.Data("December", 99));

//Series 2
XYChart.Series series2 = new XYChart.Series();
series2.setName("XYChart.Series 2");

series2.getData().add(new XYChart.Data("January", 150));
series2.getData().add(new XYChart.Data("February", 100));
series2.getData().add(new XYChart.Data("March", 60));
series2.getData().add(new XYChart.Data("April", 40));
series2.getData().add(new XYChart.Data("May", 30));
series2.getData().add(new XYChart.Data("June", 100));
series2.getData().add(new XYChart.Data("July", 100));
series2.getData().add(new XYChart.Data("August", 10));
series2.getData().add(new XYChart.Data("September", 175));
series2.getData().add(new XYChart.Data("October", 155));
series2.getData().add(new XYChart.Data("November", 125));
series2.getData().add(new XYChart.Data("December", 150));

areaChart.getData().addAll(series1, series2);

areaChart.getStylesheets().add(
getClass().getResource("chartStyle.css").toExternalForm());

root.getChildren().addAll(areaChart);
primaryStage.setScene(new Scene(root, 500, 400));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


Reference: Styling Charts with CSS.

Saturday, August 31, 2013

Set background color of JavaFX ListView cells, with CSS

The old post show how to "Hide empty cell of TableView with CSS". This example apply similar approach, to set background color for various cells, empty, hover, selected.

Set background color of JavaFX ListView cells
Set background color of JavaFX ListView cells

Create javafx_testtableview/style_tableview.css file.
.table-row-cell:empty {
-fx-background-color: khaki;
-fx-border-color: grey
}

.table-row-cell:hover{
-fx-background-color: blanchedalmond;
}

.table-row-cell:selected{
-fx-background-color: chocolate;
}


Java code.
package javafx_testtableview;

import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_TestTableView extends Application {

public static class Record {

private final SimpleIntegerProperty id;
private final SimpleStringProperty name;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;

private Record(int id, String name, String lastName, String email) {
this.id = new SimpleIntegerProperty(id);
this.name = new SimpleStringProperty(name);
this.lastName = new SimpleStringProperty(lastName);
this.email = new SimpleStringProperty(email);
}

public int getId() {
return this.id.get();
}

public void setId(int id) {
this.id.set(id);
}

public String getName() {
return this.name.get();
}

public void setName(String name) {
this.name.set(name);
}

public String getLastName() {
return this.lastName.get();
}

public void setLastName(String lastName) {
this.lastName.set(lastName);
}

public String getEmail() {
return this.email.get();
}

public void setEmail(String email) {
this.email.set(email);
}
}
private TableView<Record> tableView = new TableView<>();
private final ObservableList<Record> recordList = FXCollections.observableArrayList();

private void prepareRecordList() {
recordList.add(new Record(12, "William", "Austin", "xxx@xxx.xxx"));
recordList.add(new Record(15, "Chris", "redfield", "yyy@yyy.yyy"));
recordList.add(new Record(1, "Java", "Buddy", "javabuddy@abc.yyy"));
recordList.add(new Record(2, "Eric", "Buddy", "ericbuddy@abc.yyy"));
recordList.add(new Record(3, "Peter", "handsome", "peter@abc.yyy"));
}

@Override
public void start(Stage primaryStage) {
Scene scene = new Scene(new Group());
primaryStage.setTitle("http://java-buddy.blogspot.com/");
primaryStage.setWidth(400);
primaryStage.setHeight(400);

prepareRecordList();

tableView.setEditable(false);

Callback<TableColumn, TableCell> integerCellFactory =
new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn p) {
MyIntegerTableCell cell = new MyIntegerTableCell();
cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new MyEventHandler());
return cell;
}
};

Callback<TableColumn, TableCell> stringCellFactory =
new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn p) {
MyStringTableCell cell = new MyStringTableCell();
cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new MyEventHandler());
return cell;
}
};

TableColumn colId = new TableColumn("ID");
colId.setCellValueFactory(
new PropertyValueFactory<Record, String>("id"));
colId.setCellFactory(integerCellFactory);

TableColumn colName = new TableColumn("Name");
colName.setCellValueFactory(
new PropertyValueFactory<Record, String>("name"));
colName.setCellFactory(stringCellFactory);

TableColumn colLastName = new TableColumn("Last Name");
colLastName.setCellValueFactory(
new PropertyValueFactory<Record, String>("lastName"));
colLastName.setCellFactory(stringCellFactory);

TableColumn colEmail = new TableColumn("Email");
colEmail.setCellValueFactory(
new PropertyValueFactory<Record, String>("email"));
colEmail.setCellFactory(stringCellFactory);

tableView.setItems(recordList);
tableView.getColumns().addAll(colId, colName, colLastName, colEmail);

tableView.getStylesheets().add("javafx_testtableview/style_tableview");

final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().add(tableView);

((Group) scene.getRoot()).getChildren().addAll(vbox);

primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}

class MyIntegerTableCell extends TableCell<Record, Integer> {

@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : getString());
setGraphic(null);
}

private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}

class MyStringTableCell extends TableCell<Record, String> {

@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : getString());
setGraphic(null);
}

private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}

class MyEventHandler implements EventHandler<MouseEvent> {

@Override
public void handle(MouseEvent t) {
TableCell c = (TableCell) t.getSource();
int index = c.getIndex();

try {
Record item = recordList.get(index);
System.out.println("id = " + item.getId());
System.out.println("name = " + item.getName());
System.out.println("lastName = " + item.getLastName());
System.out.println("email = " + item.getEmail());
} catch (IndexOutOfBoundsException exception) {
//...
}

}
}
}

Friday, August 30, 2013

JavaFX example: bind more than one value with NumberBinding

This example show to to bind the value of sliderSum to the sum of slider1 and slider2 values with NumberBinding.

bind more than one value with NumberBinding
Bind more than one value with NumberBinding

package javafx_numberbinding;

import javafx.application.Application;
import javafx.beans.binding.NumberBinding;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_NumberBinding extends Application {

@Override
public void start(Stage primaryStage) {

Slider slider1 = new Slider(0, 100, 0);
Slider slider2 = new Slider(0, 50, 0);
Slider sliderBind1 = new Slider(0, 100, 0);
Slider sliderBind2 = new Slider(0, 50, 0);
Slider sliderSum = new Slider(0, 150, 0);

sliderBind1.valueProperty().bind(slider1.valueProperty());
sliderBind2.valueProperty().bind(slider2.valueProperty());

NumberBinding numberSum = slider1.valueProperty().add(slider2.valueProperty());
sliderSum.valueProperty().bind(numberSum);

VBox vBox = new VBox();
vBox.setPadding(new Insets(5, 5, 5, 5));
vBox.setSpacing(5);
vBox.getChildren().addAll(
slider1,
slider2,
sliderBind1,
sliderBind2,
sliderSum);

StackPane root = new StackPane();
root.getChildren().add(vBox);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}
}


Sunday, August 25, 2013

Implement custom Properties for bind() and ChangeListener()

In the post of "JavaFX example of Service", the UI elements progressBar and labelCount are bind to build-in properties, progressProperty and messageProperty, of Service. Now I want to update progressBar and labelCount in 5 second; we can create our custom Properties, process5sec and Message5sec, such that we can bind them to UI elements or addListener() to trace the changing for them.

Implement custom Properties for bind() and ChangeListener()
Implement custom Properties for bind() and ChangeListener()

package javafx_service;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Service extends Application {

MyService myService;

@Override
public void start(Stage primaryStage) {

final ProgressBar progressBar = new ProgressBar();
final Label labelCount = new Label();
final Label labelState = new Label();
final Label labelSucceeded = new Label();

myService = new MyService();

myService.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
labelSucceeded.setText("OnSucceeded");
}
});

myService.setOnRunning(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
labelSucceeded.setText("OnRunning");
}
});

myService.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
labelSucceeded.setText("OnFailed");
}
});

myService.process5secProperty().addListener(new ChangeListener(){

@Override
public void changed(ObservableValue ov, Object t, Object t1) {

double p = (double)(((Integer)t1).intValue());
progressBar.setProgress(p/50);
}
});

labelCount.textProperty().bind(myService.Message5sec);

Button btnStart = new Button("Start Service");
btnStart.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
myService.start();
}
});

Button btnReadTaskState = new Button("Read Service State");
btnReadTaskState.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
labelState.setText(myService.getState().toString());
}
});

VBox vBox = new VBox();
vBox.setPadding(new Insets(5, 5, 5, 5));
vBox.setSpacing(5);
vBox.getChildren().addAll(
progressBar,
labelCount,
btnStart,
btnReadTaskState,
labelState,
labelSucceeded);

StackPane root = new StackPane();
root.getChildren().add(vBox);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}

private class MyService extends Service<Void> {

private final IntegerProperty process5sec = new SimpleIntegerProperty();

public int getProcess5sec() {
return process5sec.get();
}

public void setProcess5sec(int value) {
process5sec.set(value);
}

public IntegerProperty process5secProperty() {
return process5sec;
}
private final StringProperty Message5sec = new SimpleStringProperty();

public String getMessage5sec() {
return Message5sec.get();
}

public void setMessage5sec(String value) {
Message5sec.set(value);
}

public StringProperty Message5secProperty() {
return Message5sec;
}

@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
int max = 50;
for (int i = 1; i <= max; i++) {
if (isCancelled()) {
break;
}

if (i % 5 == 0) {
final int i5sec = i;
Platform.runLater(new Runnable() {
@Override
public void run() {
setProcess5sec(i5sec);
setMessage5sec(String.valueOf(i5sec));
}
});
}

Thread.sleep(100);
}
return null;
}
};
}
}
}



Friday, August 23, 2013

JavaFX example: Modality

javafx.stage.Modality defines the possible modality types for a Stage.


package javafx_modality;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.layout.VBoxBuilder;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Modality extends Application {

@Override
public void start(Stage primaryStage) {

/*
* initModality() much be called prior to making the stage visible.
* The modality is one of: Modality.NONE, Modality.WINDOW_MODAL,
* or Modality.APPLICATION_MODAL.
*/

//NONE
Button btnNONE = new Button();
btnNONE.setText("Open NONE dialog");
btnNONE.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Stage dialogNONE = new Stage();
dialogNONE.initModality(Modality.NONE);

Scene sceneNONE = new Scene(VBoxBuilder.create()
.children(
new Text("NONE dialog"),
new Text("Defines a top-level window that is not "
+ "modal and does not block any other window."))
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build());

dialogNONE.setTitle("NONE dialog");
dialogNONE.setScene(sceneNONE);
dialogNONE.show();
}
});

//APPLICATION_MODAL
Button btnAPPLICATION_MODAL = new Button();
btnAPPLICATION_MODAL.setText("Open APPLICATION_MODAL dialog");
btnAPPLICATION_MODAL.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Stage dialogAPPLICATION_MODAL = new Stage();
dialogAPPLICATION_MODAL.initModality(Modality.APPLICATION_MODAL);

Scene sceneAPPLICATION_MODAL = new Scene(VBoxBuilder.create()
.children(
new Text("APPLICATION_MODAL dialog"),
new Text("Defines a modal window that blocks events "
+ "from being delivered to any other application window."))
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build());

dialogAPPLICATION_MODAL.setTitle("APPLICATION_MODAL dialog");
dialogAPPLICATION_MODAL.setScene(sceneAPPLICATION_MODAL);
dialogAPPLICATION_MODAL.show();
}
});

//WINDOW_MODAL
Button btnWINDOW_MODAL = new Button();
btnWINDOW_MODAL.setText("Open WINDOW_MODAL dialog");
btnWINDOW_MODAL.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Stage dialogWINDOW_MODAL = new Stage();
dialogWINDOW_MODAL.initModality(Modality.WINDOW_MODAL);

Scene sceneWINDOW_MODAL = new Scene(VBoxBuilder.create()
.children(
new Text("WINDOW_MODAL dialog"),
new Text("Defines a modal window that block events "
+ "from being delivered to its entire owner window "
+ "hierarchy."))
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build());

dialogWINDOW_MODAL.setTitle("WINDOW_MODAL dialog");
dialogWINDOW_MODAL.setScene(sceneWINDOW_MODAL);
dialogWINDOW_MODAL.show();
}
});

VBox vBox = new VBox();
vBox.setAlignment(Pos.CENTER);
vBox.setSpacing(10);
vBox.getChildren().addAll(
btnNONE,
btnAPPLICATION_MODAL,
btnWINDOW_MODAL);

StackPane root = new StackPane();
root.getChildren().add(vBox);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


Tuesday, August 20, 2013

JavaFX example: Service

JavaFX example: Service
JavaFX example: Service


package javafx_service;

import javafx.application.Application;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Service extends Application {

MyService myService;

@Override
public void start(Stage primaryStage) {

final ProgressBar progressBar = new ProgressBar();
final Label labelCount = new Label();
final Label labelState = new Label();
final Label labelSucceeded = new Label();

myService = new MyService();

myService.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
labelSucceeded.setText("OnSucceeded");
}
});

myService.setOnRunning(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
labelSucceeded.setText("OnRunning");
}
});

myService.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
labelSucceeded.setText("OnFailed");
}
});

progressBar.progressProperty().bind(myService.progressProperty());
labelCount.textProperty().bind(myService.messageProperty());

Button btnStart = new Button("Start Service");
btnStart.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
myService.start();
}
});

Button btnReadTaskState = new Button("Read Service State");
btnReadTaskState.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
labelState.setText(myService.getState().toString());
}
});

VBox vBox = new VBox();
vBox.setPadding(new Insets(5, 5, 5, 5));
vBox.setSpacing(5);
vBox.getChildren().addAll(
progressBar,
labelCount,
btnStart,
btnReadTaskState,
labelState,
labelSucceeded);

StackPane root = new StackPane();
root.getChildren().add(vBox);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}

private class MyService extends Service<Void> {

@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
int max = 50;
for (int i = 1; i <= max; i++) {
if (isCancelled()) {
break;
}

updateProgress(i, max);
updateMessage(String.valueOf(i));

Thread.sleep(100);
}
return null;
}
};
}
}
}


Related:
- Implement custom Properties for bind() and ChangeListener()

Monday, August 19, 2013

JavaFX example: Task

JavaFX example: Task
JavaFX example: Task


package javafx_task;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_Task extends Application {

@Override
public void start(Stage primaryStage) {

final Task task;
task = new Task<Void>() {
@Override
protected Void call() throws Exception {
int max = 50;
for (int i = 1; i <= max; i++) {
if (isCancelled()) {
break;
}
updateProgress(i, max);
updateMessage(String.valueOf(i));

Thread.sleep(100);
}
return null;
}
};

ProgressBar progressBar = new ProgressBar();
progressBar.setProgress(0);
progressBar.progressProperty().bind(task.progressProperty());

Label labelCount = new Label();
labelCount.textProperty().bind(task.messageProperty());

final Label labelState = new Label();

Button btnStart = new Button("Start Task");
btnStart.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent t) {
new Thread(task).start();
}
});

Button btnReadTaskState = new Button("Read Task State");
btnReadTaskState.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent t) {
labelState.setText(task.getState().toString());
}
});


VBox vBox = new VBox();
vBox.setPadding(new Insets(5, 5, 5, 5));
vBox.setSpacing(5);
vBox.getChildren().addAll(
progressBar,
labelCount,
btnStart,
btnReadTaskState,
labelState);

StackPane root = new StackPane();
root.getChildren().add(vBox);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();

}

public static void main(String[] args) {
launch(args);
}
}




Saturday, August 17, 2013

JavaFX example: ToggleGroup

JavaFX example: ToggleGroup
JavaFX example: ToggleGroup


package javafx_togglegroup;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_ToggleGroup extends Application {

@Override
public void start(Stage primaryStage) {

ToggleButton toggleButton1 = new ToggleButton("Button 1");
ToggleButton toggleButton2 = new ToggleButton("Button 2");
ToggleButton toggleButton3 = new ToggleButton("Button 3");

ToggleGroup toggleGroup = new ToggleGroup();
toggleButton1.setToggleGroup(toggleGroup);
toggleButton2.setToggleGroup(toggleGroup);
toggleButton3.setToggleGroup(toggleGroup);

HBox hBox = new HBox();
hBox.getChildren().addAll(toggleButton1, toggleButton2, toggleButton3);

Group root = new Group();
root.getChildren().add(hBox);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}




Friday, August 16, 2013

Simple example of using JavaFX ToolBar

Simple example of JavaFX ToolBar
Simple example of JavaFX ToolBar


package javafx_toolbar;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_ToolBar extends Application {

@Override
public void start(Stage primaryStage) {

Button toolButton1 = new Button("Tool 1");
toolButton1.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent t) {
System.out.println("Tool 1 clicked!");
}
});

ToolBar toolBar = new ToolBar();
toolBar.getItems().add(toolButton1);
toolBar.getItems().add(new Button("Tool Opt2"));
toolBar.getItems().add(new Button("Tool Opt3"));
toolBar.setPrefWidth(300);

Group root = new Group();
root.getChildren().add(toolBar);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


Tuesday, August 13, 2013

Embed Google PageSpeed Insights in JavaFX WebView

Google's PageSpeed Insights is a tool that helps developers optimize their web pages by analyzing the pages and generating tailored suggestions to make the pages faster. You can use the PageSpeed Insights API to programmatically generate PageSpeed scores and suggestions.

Using Insights API, it's easy to embed the result to JavaFX application with WenView. This example demonstrate how to do it.

Embed Google PageSpeed Insights in JavaFX WebView
Embed Google PageSpeed Insights in JavaFX WebView
To acquire an API key, visit the APIs Console. In the Services pane, activate the PageSpeed Insights API; if the Terms of Service appear, read and accept them.

Next, go to the API Access pane. The API key is near the bottom of that pane, in the section titled "Simple API Access."

After you have an API key, your application can append the query parameter key=yourAPIKey to all request URLs.

Create HTML file, PageSpeedTest.html, to be embedded in WebView, with Javascript code of Insights API. Basically, it copy the example code from PageSpeed Insights Developer's Guide (v1) with little bit modification. You have to insert your API key in API_KEY.

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script>
// Specify your actual API key here:
var API_KEY = 'insert your API key here';

// Specify the URL you want PageSpeed results for here:
var URL_TO_GET_RESULTS_FOR = 'http://java-buddy.blogspot.com/';
</script>

<script>
var API_URL = 'https://www.googleapis.com/pagespeedonline/v1/runPagespeed?';
var CHART_API_URL = 'http://chart.apis.google.com/chart?';

// Object that will hold the callbacks that process results from the
// PageSpeed Insights API.
var callbacks = {};

// Invokes the PageSpeed Insights API. The response will contain
// JavaScript that invokes our callback with the PageSpeed results.
function runPagespeed() {

alert('runPagespeed()');
document.getElementById('testedurl').innerHTML = URL_TO_GET_RESULTS_FOR;

var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
var query = [
'url=' + URL_TO_GET_RESULTS_FOR,
'callback=runPagespeedCallbacks',
'key=' + API_KEY
].join('&');
s.src = API_URL + query;
document.head.insertBefore(s, null);
}

// Our JSONP callback. Checks for errors, then invokes our callback handlers.
function runPagespeedCallbacks(result) {

alert('runPagespeedCallbacks(result)');

if (result.error) {

alert('result.error');

var errors = result.error.errors;
for (var i = 0, len = errors.length; i < len; ++i) {
if (errors[i].reason === 'badRequest' && API_KEY === 'yourAPIKey') {
alert('Please specify your Google API key in the API_KEY variable.');
} else {
// NOTE: your real production app should use a better
// mechanism than alert() to communicate the error to the user.
alert(errors[i].message);
}
}
return;
}

// Dispatch to each function on the callbacks object.
for (var fn in callbacks) {
var f = callbacks[fn];
if (typeof f === 'function') {
callbacks[fn](result);
}
}

alert('runPagespeedCallbacks(result) finished!');
}

</script>

<script>
callbacks.displayPageSpeedScore = function(result) {
var score = result.score;
// Construct the query to send to the Google Chart Tools.
var query = [
'chtt=Page+Speed+score:+' + score,
'chs=180x100',
'cht=gom',
'chd=t:' + score,
'chxt=x,y',
'chxl=0:|' + score
].join('&');
var i = document.createElement('img');
i.src = CHART_API_URL + query;
document.body.insertBefore(i, null);
};
</script>

<script>
callbacks.displayTopPageSpeedSuggestions = function(result) {
var results = [];
var ruleResults = result.formattedResults.ruleResults;
for (var i in ruleResults) {
var ruleResult = ruleResults[i];
// Don't display lower-impact suggestions.
if (ruleResult.ruleImpact < 3.0)
continue;
results.push({name: ruleResult.localizedRuleName,
impact: ruleResult.ruleImpact});
}
results.sort(sortByImpact);
var ul = document.createElement('ul');
for (var i = 0, len = results.length; i < len; ++i) {
var r = document.createElement('li');
r.innerHTML = results[i].name;
ul.insertBefore(r, null);
}
if (ul.hasChildNodes()) {
document.body.insertBefore(ul, null);
} else {
var div = document.createElement('div');
div.innerHTML = 'No high impact suggestions. Good job!';
document.body.insertBefore(div, null);
}
};

// Helper function that sorts results in order of impact.
function sortByImpact(a, b) {
return b.impact - a.impact;
}
</script>

<script>
var RESOURCE_TYPE_INFO = [
{label: 'JavaScript', field: 'javascriptResponseBytes', color: 'e2192c'},
{label: 'Images', field: 'imageResponseBytes', color: 'f3ed4a'},
{label: 'CSS', field: 'cssResponseBytes', color: 'ff7008'},
{label: 'HTML', field: 'htmlResponseBytes', color: '43c121'},
{label: 'Flash', field: 'flashResponseBytes', color: 'f8ce44'},
{label: 'Text', field: 'textResponseBytes', color: 'ad6bc5'},
{label: 'Other', field: 'otherResponseBytes', color: '1051e8'}
];

callbacks.displayResourceSizeBreakdown = function(result) {
var stats = result.pageStats;
var labels = [];
var data = [];
var colors = [];
var totalBytes = 0;
var largestSingleCategory = 0;
for (var i = 0, len = RESOURCE_TYPE_INFO.length; i < len; ++i) {
var label = RESOURCE_TYPE_INFO[i].label;
var field = RESOURCE_TYPE_INFO[i].field;
var color = RESOURCE_TYPE_INFO[i].color;
if (field in stats) {
var val = Number(stats[field]);
totalBytes += val;
if (val > largestSingleCategory)
largestSingleCategory = val;
labels.push(label);
data.push(val);
colors.push(color);
}
}
// Construct the query to send to the Google Chart Tools.
var query = [
'chs=300x140',
'cht=p3',
'chts=' + ['000000', 16].join(','),
'chco=' + colors.join('|'),
'chd=t:' + data.join(','),
'chdl=' + labels.join('|'),
'chdls=000000,14',
'chp=1.6',
'chds=0,' + largestSingleCategory
].join('&');
var i = document.createElement('img');
i.src = 'http://chart.apis.google.com/chart?' + query;
document.body.insertBefore(i, null);
};
</script>

</head>
<body onload="runPagespeed();">
<div>Java-Buddy: Google Page Speed Insights test</div>
<p id="testedurl">
</body>

</html>



Main JavaFX code.
package javafx_pagespeedinsights;

import java.net.URL;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

/**
*
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_PageSpeedInsights extends Application {

private Scene scene;
MyBrowser myBrowser;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("java-buddy.blogspot.com");

myBrowser = new MyBrowser();
scene = new Scene(myBrowser, 640, 500);

primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}

class MyBrowser extends Region {

HBox toolbar;
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();

public MyBrowser() {

final URL PageSpeedTest = getClass().getResource("PageSpeedTest.html");
webEngine.load(PageSpeedTest.toExternalForm());

webEngine.setOnAlert(new EventHandler<WebEvent<String>>(){

@Override
public void handle(WebEvent<String> t) {
System.out.println(t.getData());
}

});

getChildren().add(webView);

}
}
}