Friday, January 4, 2013

Implement vertical label by calling setRotate() of Node

javafx.scene.Node class of JavaFX provide a setRotate(double value) method to sets the value of the property rotate.

Note that because the pivot point is computed as the center of this Node's layout bounds, any change to the layout bounds will cause the pivot point to change, which can move the object.

Example:

Implement vertical label by calling setRotate() of Node


package javafxui;

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.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaFXUI extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        btn.setRotate(45);
        btn.setTranslateY(100);
        
        HBox hBox = new HBox();
        Label verticalLabel = new Label("java-buddy");
        verticalLabel.setRotate(270);
        verticalLabel.setTranslateY(100);
        hBox.getChildren().addAll(verticalLabel, btn);
        
        StackPane root = new StackPane();
        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);
    }
}


Thursday, January 3, 2013

Implement javafx.concurrent.Task to draw random pixel on WritableImage

Implement javafx.concurrent.Task to draw random pixel on WritableImage
Implement javafx.concurrent.Task to draw random pixel on WritableImage


package javafxpixel;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaFXPixel extends Application {
    
    final int TASK_MAX = 10000;
    Task task = new Task<Void>() {

        @Override
        protected Void call() throws Exception {

            for (int i=1; i <= TASK_MAX; i++) {
                updateProgress(i, TASK_MAX);
                
                Platform.runLater(new Runnable(){

                    @Override
                    public void run() {
                        drawSomethingOnMyWritableImage();
                    }
                });
                
                try {
                    Thread.sleep(1);
                } catch (InterruptedException interrupted) {
                }
            }
            return null;
        }
    };

    
    WritableImage myWritableImage;
    PixelWriter myPixelWriter;
    final int IMG_WIDTH = 255;
    final int IMG_HEIGHT = 255;
    
    ProgressBar progressBar;
    Button startButton;
    
    @Override
    public void start(Stage primaryStage) {
        
        prepareMyWritableImage();
        
        ImageView myImage = new ImageView();        
        myImage.setImage(myWritableImage);
        
        progressBar = new ProgressBar();
        progressBar.setPrefWidth(IMG_WIDTH);
        progressBar.progressProperty().bind(task.progressProperty());
        
        startButton = new Button("Start");
        
        VBox root = new VBox();
        root.getChildren().addAll(myImage, progressBar, startButton);
        
        Scene scene = new Scene(root, 300, 300);
        
        primaryStage.setTitle("java-buddy.blogspot.com");
        primaryStage.setScene(scene);
        primaryStage.show();
        
        
        
        startButton.setOnAction(new EventHandler<ActionEvent>() {

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

    public static void main(String[] args) {
        launch(args);
    }
    
    private void prepareMyWritableImage(){
        
        myWritableImage = new WritableImage(IMG_WIDTH, IMG_HEIGHT);
        myPixelWriter = myWritableImage.getPixelWriter();
        
        //fill with background blue
        for(int x = 0; x < IMG_WIDTH; x++){
            for(int y = 0; y < IMG_HEIGHT; y++){
                myPixelWriter.setColor(x, y, Color.GRAY);
            }
        }
    }
    
    private void drawSomethingOnMyWritableImage(){
        
        int x = (int)(Math.random() * IMG_WIDTH);
        int y = (int)(Math.random() * IMG_HEIGHT);
        double r = Math.random();
        double g = Math.random();
        double b = Math.random();
        
        myPixelWriter.setColor(x, y, new Color(r, g, b, 1.0));
    }
}



Wednesday, January 2, 2013

Draw something on WritableImage

Draw something on WritableImage
Draw something on WritableImage


package javafxpixel;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @web http://java-buddy.blogspot.com/
 */
public class JavaFXPixel extends Application {
    
    WritableImage myWritableImage;
    PixelWriter myPixelWriter;
    final int IMG_WIDTH = 255;
    final int IMG_HEIGHT = 255;
    
    @Override
    public void start(Stage primaryStage) {
        
        prepareMyWritableImage();
        drawSomethingOnMyWritableImage();
        
        ImageView myImage = new ImageView();        
        myImage.setImage(myWritableImage);
        
        StackPane root = new StackPane();
        root.getChildren().add(myImage);
        
        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);
    }
    
    private void prepareMyWritableImage(){
        
        myWritableImage = new WritableImage(IMG_WIDTH, IMG_HEIGHT);
        myPixelWriter = myWritableImage.getPixelWriter();
        
        //fill with background blue
        for(int x = 0; x < IMG_WIDTH; x++){
            for(int y = 0; y < IMG_HEIGHT; y++){
                myPixelWriter.setColor(x, y, Color.GRAY);
            }
        }
    }
    
    private void drawSomethingOnMyWritableImage(){
        
        for(int x = 20; x < IMG_WIDTH - 20; x++){
            for(int y = 20; y < IMG_HEIGHT - 20; y++){
                myPixelWriter.setColor(x, y, 
                        new Color((double)x/255, (double)y/255, 0.0, 1.0));
            }
        }
        
        double l = 100.0;
        int cx = IMG_WIDTH/2;
        int cy = IMG_HEIGHT/2;
        for(int c = 0; c < 360; c++){
            double radian = Math.toRadians((double)c);
            int x = cx + (int)(l * Math.cos(radian));
            int y = cy + (int)(l * Math.sin(radian));
            myPixelWriter.setColor(x, y, Color.WHITE);
        }
    }
}