JavaFX Sequences and Predicates


Introduction

JavaFX script has array list like structures called sequences. Deriving new sequences from existing sequences can be done with predicates. One could think of it as a filter on a collection of objects that produces a new collection or sequence. In the past I’ve used Apache Commons Collection API to achieve this behavior in the Java world. So, instead of using for loops to generate new sequences you would use predicates. In JavaFX predicates are built into the language to achieve this behavior. So, I would like explore this cool facility.
Playing Cards

The Problem

With a deck of cards randomly shuffled generate four sequences with each sequence based on the one of the four suits.

Example: one pile of clubs, one pile of hearts, one pile of spades and one pile of diamonds.

Click here to see playing cards

The Solution


var deck: PlayingCard[];


// Predicates for each suit
var clubs = deck[c | c.suit == "Club"];
var hearts = deck[c | c.suit == "Heart"];
var spades = deck[c | c.suit == "Spade"];
var diamonds = deck[c | c.suit == "Diamond"];

Conclusion:

The ability to use predicates to filter nested object are quite easy.  No messy for loops. If anyone is willing to convert SVG files to JavaFX may take a look at http://commons.wikimedia.org/wiki/Category:SVG_Playing_cards . Creating all 52 cards! (Desktop to Mobile in a snap).

Below is the full source code:

/*
 * Main.fx
 *
 * Created on Feb 7, 2009, 5:24:05 PM
 */

package carlfx;

import javafx.scene.CustomNode;
import javafx.scene.effect.Reflection;
import javafx.scene.Group;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

/**
 * @author cdea
 */

def kinds = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
def suits = ["Club", "Heart", "Spade", "Diamond"];

// building a deck of cards.
var deck:PlayingCard[];
var x = 0;
var y = 0;

function retrieveImage(name, x:Number, y:Number){
    println("{__DIR__}{name}.gif");
    return ImageView {
        x:x
        y:y
        image: Image {
            url: "{__DIR__}{name}.gif"
        }
    }
}

class PlayingCard extends CustomNode{
    var kind:String;
    var suit:String;
    var root:Group;
    var lastX:Number = 25 + x;
    var lastY:Number = 55;

    protected override function create() : Node {

        if (root == null) {
            initializeCustomNode();
        }
        return root;
    }

    function initializeCustomNode():Void {
        root = Group {
            content: [
                Rectangle {
                    stroke: Color.DARKRED
                    x: lastX
                    y: lastY
                    width: 50
                    height: 70
                    arcWidth: 16
                    arcHeight: 16
                    fill: LinearGradient {
                        startX: 0.0,
                        startY: 0.0,
                        endX: 0.0,
                        endY: 1.0,
                        proportional: true
                        stops: [
                            Stop {
                                offset: 0.0
                            color: Color.WHITE},
                            Stop {
                                offset: 1.0
                            color: Color.BLACK}
                        ]
                    }
                    effect: Reflection {
                        fraction: 0.9
                        topOpacity: 0.5
                        topOffset: 2.5
                    }

                },
                Text{
                    x:25 + x + 3
                    y:55 + 10
                    font:Font{
                        size:10
                    }
                    content:kind
                },
                retrieveImage(suit, 25 + x + 3, 55 + 20)
            ]
        } // Group

    } // initializeCustomNode
}

// Build 52 playing cards
for (suit in suits) {
    for(kind in kinds){
        var card = PlayingCard {
            kind:kind
            suit:suit
        };
        x = x + 12;
        insert card into deck;
    }
}

// Predicates for each suit
var clubs = deck[c | c.suit == "Club"];
var hearts = deck[c | c.suit == "Heart"];
var spades = deck[c | c.suit == "Spade"];
var diamonds = deck[c | c.suit == "Diamond"];

// display deck in text format
println ("the deck displayed ");
for(card in hearts){
    println("card {card.kind} of {card.suit}");
}

// Display Playing Cards
Stage {
    title: "Playing Cards"
    width: 725
    height: 300
    scene: Scene {
        content:[clubs, hearts, spades, diamonds]
    }
}
Advertisements

9 thoughts on “JavaFX Sequences and Predicates

  1. carldea Post author

    Thanks, it should be ready. If anyone is having trouble just let me know. I will try to self sign it later.
    Carl

  2. Pingback: Java Desktop links of the week, February 16th | Jonathan Giles

  3. Nick

    Nice post Carl,
    Being absolutely new to javaFX, looking forward direction and help for the following:

    – I have created a tableView using javFx8 and jkd 8, by reading a csv file.
    (by refereeing a link on Oracle forum https://community.oracle.com/message/10731570)

    – I would like to extend tableView similar to EXCEL filters, meaning add filters to EACH column, populate checkbox for common values from that column. When click on the checkbox, display table with rows related to the checkbox items only. (Same as EXCEL, where we provide filters to the column and display rows).

    – please directed me a sample code at lgframeATyahooDOTcom, if possible….

  4. carldea Post author

    You should check out the ControlsFX project. They already have a spreadsheet control to be used in that manner.
    I hope that helps.
    Have fun coding,
    Carl

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s