Tuesday, June 21, 2016

buat game puzzlepieces menggunakan netbeans

dalam permainan ini kita akan membuatnya menggunakan javafx pada netbeans, berikut tutorialnya:

-klik new project

-pilih javafx>next

-masukan nama project PuzzlePieces

-masukan gambar dibawah ini kedalam project dengan cara drag atau dengan cara copy netbeansproject>PuzzlePieces>src>PuzzlePieces

nama pitcure PuzzlePieces-picture.jpg

-/*
 * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
 * All rights reserved. Use is subject to license terms.
 *
 * This file is available and licensed under the following license:
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the distribution.
 *  - Neither the name of Oracle Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package puzzlepieces;

import java.util.ArrayList;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 * A sample in which an image is broken into pieces to create a jigsaw puzzle.
 *
 * @see javafx.scene.shape.Path
 * @see javafx.scene.image.Image
 * @see javafx.scene.image.ImageView
 * @see javafx.scene.control.Button
 * @see javafx.scene.layout.Pane
 * @see javafx.scene.input.MouseEvent
 * @see javafx.scene.effect.DropShadow
 * @resource PuzzlePieces-picture.jpg
 */
public class PuzzlePieces extends Application {
    private Timeline timeline;

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root));
        // load puzzle image
        Image image = new Image(getClass().getResourceAsStream(
            "PuzzlePieces-picture.jpg"));
        int numOfColumns = (int) (image.getWidth() / Piece.SIZE);
        int numOfRows = (int) (image.getHeight() / Piece.SIZE);
        // create desk
        final Desk desk = new Desk(numOfColumns, numOfRows);
        // create puzzle pieces
        final List<Piece> pieces  = new ArrayList<Piece>();
        for (int col = 0; col < numOfColumns; col++) {
            for (int row = 0; row < numOfRows; row++) {
                int x = col * Piece.SIZE;
                int y = row * Piece.SIZE;
                final Piece piece = new Piece(image, x, y, row>0, col>0,
                        row<numOfRows -1, col < numOfColumns -1,
                        desk.getWidth(), desk.getHeight());
                pieces.add(piece);
            }
        }
        desk.getChildren().addAll(pieces);
        // create button box
        Button shuffleButton = new Button("Shuffle");
        shuffleButton.setStyle("-fx-font-size: 2em;");
        shuffleButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
                if (timeline != null) timeline.stop();
                timeline = new Timeline();
                for (final Piece piece : pieces) {
                   piece.setActive();
                   double shuffleX = Math.random() *
                           (desk.getWidth() - Piece.SIZE + 48f ) -
                           24f - piece.getCorrectX();
                   double shuffleY = Math.random() *
                           (desk.getHeight() - Piece.SIZE + 30f ) -
                           15f - piece.getCorrectY();
                    timeline.getKeyFrames().add(
                        new KeyFrame(Duration.seconds(1),
                            new KeyValue(piece.translateXProperty(), shuffleX),
                            new KeyValue(piece.translateYProperty(), shuffleY)));
                }
                timeline.playFromStart();
            }
        });
        Button solveButton = new Button("Solve");
        solveButton.setStyle("-fx-font-size: 2em;");
        solveButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
                if (timeline != null) timeline.stop();
                timeline = new Timeline();
                for (final Piece piece : pieces) {
                    piece.setInactive();
                    timeline.getKeyFrames().add(
                        new KeyFrame(Duration.seconds(1),
                            new KeyValue(piece.translateXProperty(), 0),
                            new KeyValue(piece.translateYProperty(), 0)));
                }
                timeline.playFromStart();
            }
        });
        HBox buttonBox = new HBox(8);
        buttonBox.getChildren().addAll(shuffleButton, solveButton);
        // create vbox for desk and buttons
        VBox vb = new VBox(10);
        vb.getChildren().addAll(desk,buttonBox);
        root.getChildren().addAll(vb);
    }

    /**
     * Node that represents the playing area/ desktop where the puzzle pices sit
     */
    public static class Desk extends Pane {
        Desk(int numOfColumns, int numOfRows) {
            setStyle("-fx-background-color: #cccccc; " +
                    "-fx-border-color: #464646; " +
                    "-fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.8) , 15, 0.0 , 0 , 4 );");
            double DESK_WIDTH = Piece.SIZE * numOfColumns;
            double DESK_HEIGHT = Piece.SIZE * numOfRows;
            setPrefSize(DESK_WIDTH,DESK_HEIGHT);
            setMaxSize(DESK_WIDTH, DESK_HEIGHT);
            autosize();
            // create path for lines
            Path grid = new Path();
            grid.setStroke(Color.rgb(70, 70, 70));
            getChildren().add(grid);
            // create vertical lines
             for (int col = 0; col < numOfColumns - 1; col++) {
                 grid.getElements().addAll(
                     new MoveTo(Piece.SIZE + Piece.SIZE * col, 5),
                     new LineTo(Piece.SIZE + Piece.SIZE * col, Piece.SIZE * numOfRows - 5)
                 );
            }
            // create horizontal lines
            for (int row = 0; row < numOfRows - 1; row++) {
                 grid.getElements().addAll(
                     new MoveTo(5, Piece.SIZE + Piece.SIZE * row),
                     new LineTo(Piece.SIZE * numOfColumns - 5, Piece.SIZE + Piece.SIZE * row)
                 );
            }
        }
        @Override protected void layoutChildren() {}
    }

    /**
     * Node that represents a puzzle piece
     */
    public static class Piece extends Parent {
        public static final int SIZE = 100;
        private final double correctX;
        private final double correctY;
        private final boolean hasTopTab;
        private final boolean hasLeftTab;
        private final boolean hasBottomTab;
        private final boolean hasRightTab;
        private double startDragX;
        private double startDragY;
        private Shape pieceStroke;
        private Shape pieceClip;
        private ImageView imageView = new ImageView();
        private Point2D dragAnchor;

        public Piece(Image image, final double correctX, final double correctY,
                     boolean topTab, boolean leftTab, boolean bottomTab, boolean rightTab,
                     final double deskWidth, final double deskHeight) {
            this.correctX = correctX;
            this.correctY = correctY;
            this.hasTopTab = topTab;
            this.hasLeftTab = leftTab;
            this.hasBottomTab = bottomTab;
            this.hasRightTab = rightTab;
            // configure clip
            pieceClip = createPiece();
            pieceClip.setFill(Color.WHITE);
            pieceClip.setStroke(null);
            // add a stroke
            pieceStroke = createPiece();
            pieceStroke.setFill(null);
            pieceStroke.setStroke(Color.BLACK);
            // create image view
            imageView.setImage(image);
            imageView.setClip(pieceClip);
            setFocusTraversable(true);
            getChildren().addAll(imageView, pieceStroke);
            // turn on caching so the jigsaw piece is fasr to draw when dragging
            setCache(true);
            // start in inactive state
            setInactive();
            // add listeners to support dragging
            setOnMousePressed(new EventHandler<MouseEvent>() {
                public void handle(MouseEvent me) {
                    toFront();
                    startDragX = getTranslateX();
                    startDragY = getTranslateY();
                    dragAnchor = new Point2D(me.getSceneX(), me.getSceneY());
                }
            });
            setOnMouseReleased(new EventHandler<MouseEvent>() {
                public void handle(MouseEvent me) {
                    if (getTranslateX() < (10) && getTranslateX() > (- 10) &&
                        getTranslateY() < (10) && getTranslateY() > (- 10)) {
                        setTranslateX(0);
                        setTranslateY(0);
                        setInactive();
                    }
                }
            });
            setOnMouseDragged(new EventHandler<MouseEvent>() {
                public void handle(MouseEvent me) {
                    double newTranslateX = startDragX
                                            + me.getSceneX() - dragAnchor.getX();
                    double newTranslateY = startDragY
                                            + me.getSceneY() - dragAnchor.getY();
                    double minTranslateX = - 45f - correctX;
                    double maxTranslateX = (deskWidth - Piece.SIZE + 50f ) - correctX;
                    double minTranslateY = - 30f - correctY;
                    double maxTranslateY = (deskHeight - Piece.SIZE + 70f ) - correctY;
                    if ((newTranslateX> minTranslateX ) &&
                            (newTranslateX< maxTranslateX) &&
                            (newTranslateY> minTranslateY) &&
                            (newTranslateY< maxTranslateY)) {
                        setTranslateX(newTranslateX);
                        setTranslateY(newTranslateY);
                    }
                }
            });
        }

        private Shape createPiece() {
            Shape shape = createPieceRectangle();
            if (hasRightTab) {
                shape = Shape.union(shape,
                        createPieceTab(69.5f, 0f, 10f, 17.5f, 50f, -12.5f, 11.5f,
                                25f, 56.25f, -14f, 6.25f, 56.25f, 14f, 6.25f));
            }
            if (hasBottomTab) {
                shape = Shape.union(shape,
                        createPieceTab(0f, 69.5f, 17.5f, 10f, -12.5f, 50f, 25f,
                                11f, -14f, 56.25f, 6.25f, 14f, 56.25f, 6.25f));
            }
            if (hasLeftTab) {
                shape = Shape.subtract(shape,
                        createPieceTab(-31f, 0f, 10f, 17.5f, -50f, -12.5f, 11f,
                                25f, -43.75f, -14f, 6.25f, -43.75f, 14f, 6.25f));
            }
            if (hasTopTab) {
                shape = Shape.subtract(shape,
                        createPieceTab(0f, -31f, 17.5f, 10f, -12.5f, -50f, 25f,
                                12.5f, -14f, -43.75f, 6.25f, 14f, -43.75f, 6.25f));
            }
            shape.setTranslateX(correctX);
            shape.setTranslateY(correctY);
            shape.setLayoutX(50f);
            shape.setLayoutY(50f);
            return shape;
        }

        private Rectangle createPieceRectangle() {
            Rectangle rec = new Rectangle();
            rec.setX(-50);
            rec.setY(-50);
            rec.setWidth(SIZE);
            rec.setHeight(SIZE);
            return rec;
        }

        private Shape createPieceTab(double eclipseCenterX, double eclipseCenterY, double eclipseRadiusX, double eclipseRadiusY,
                                     double rectangleX, double rectangleY, double rectangleWidth, double rectangleHeight,
                                     double circle1CenterX, double circle1CenterY, double circle1Radius,
                                     double circle2CenterX, double circle2CenterY, double circle2Radius) {
            Ellipse e = new Ellipse(eclipseCenterX, eclipseCenterY, eclipseRadiusX, eclipseRadiusY);
            Rectangle r = new Rectangle(rectangleX, rectangleY, rectangleWidth, rectangleHeight);
            Shape tab = Shape.union(e, r);
            Circle c1 = new Circle(circle1CenterX, circle1CenterY, circle1Radius);
            tab = Shape.subtract(tab, c1);
            Circle c2 = new Circle(circle2CenterX, circle2CenterY, circle2Radius);
            tab = Shape.subtract(tab, c2);
            return tab;
        }

        public void setActive() {
            setDisable(false);
            setEffect(new DropShadow());
            toFront();
        }

        public void setInactive() {
            setEffect(null);
            setDisable(true);
            toBack();
        }

        public double getCorrectX() { return correctX; }

        public double getCorrectY() { return correctY; }
    }

    @Override public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }

    /**
     * The main() method is ignored in correctly deployed JavaFX
     * application. main() serves only as fallback in case the
     * application can not be launched through deployment artifacts,
     * e.g., in IDEs with limited FX support. NetBeans ignores main().
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

pembuatan web browser (javafx) menggunakan netbeans

untuk membuat web browser, berikut adalah tutorialnya:
-buat project baru pada netbeans
-pilih javafx
-masukan nama project webviewbrowser
-isi script dibawah kedalam webviewbrowser.java

/*
 * Copyright (c) 2012 Oracle and/or its affiliates.
 * All rights reserved. Use is subject to license terms.
 *
 * This file is available and licensed under the following license:
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the distribution.
 *  - Neither the name of Oracle Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package webviewbrowser;

import java.util.List;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

/**
 * Demonstrates a WebView object accessing a web page.
 *
 * @see javafx.scene.web.WebView
 * @see javafx.scene.web.WebEngine
 */
public class WebViewBrowser extends Application {

    @Override public void start(Stage primaryStage) throws Exception {
        Pane root = new WebViewPane();
        primaryStage.setScene(new Scene(root, 1024, 768));
        primaryStage.show();
    }


    /**
     * The main() method is ignored in correctly deployed JavaFX
     * application. main() serves only as fallback in case the
     * application can not be launched through deployment artifacts,
     * e.g., in IDEs with limited FX support. NetBeans ignores main().
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    /**
     * Create a resizable WebView pane
     */
    public class WebViewPane extends Pane {

        public WebViewPane() {
            VBox.setVgrow(this, Priority.ALWAYS);
            setMaxWidth(Double.MAX_VALUE);
            setMaxHeight(Double.MAX_VALUE);

            WebView view = new WebView();
            view.setMinSize(500, 400);
            view.setPrefSize(500, 400);
            final WebEngine eng = view.getEngine();
            eng.load("http://www.oracle.com/us/index.html");
            final TextField locationField = new TextField("http://www.oracle.com/us/index.html");
            locationField.setMaxHeight(Double.MAX_VALUE);
            Button goButton = new Button("Go");
            goButton.setDefaultButton(true);
            EventHandler<ActionEvent> goAction = new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent event) {
                    eng.load(locationField.getText().startsWith("http://") ? locationField.getText() :
                            "http://" + locationField.getText());
                }
            };
            goButton.setOnAction(goAction);
            locationField.setOnAction(goAction);
            eng.locationProperty().addListener(new ChangeListener<String>() {
                @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                    locationField.setText(newValue);
                }
            });
            GridPane grid = new GridPane();
            grid.setVgap(5);
            grid.setHgap(5);
            GridPane.setConstraints(locationField, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
            GridPane.setConstraints(goButton,1,0);
            GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
            grid.getColumnConstraints().addAll(
                    new ColumnConstraints(100, 100, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true),
                    new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true)
            );
            grid.getChildren().addAll(locationField, goButton, view);
            getChildren().add(grid);
        }

        @Override protected void layoutChildren() {
            List<Node> managed = getManagedChildren();
            double width = getWidth();
            double height = getHeight();
            double top = getInsets().getTop();
            double right = getInsets().getRight();
            double left = getInsets().getLeft();
            double bottom = getInsets().getBottom();
            for (int i = 0; i < managed.size(); i++) {
                Node child = managed.get(i);
                layoutInArea(child, left, top,
                               width - left - right, height - top - bottom,
                               0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER);
            }
        }
    }
}

Tuesday, June 14, 2016

stopwatch netbeans

-klik new project
-pilih java fx>java application>klik next
-isi nama project dengan nama stopwatch>finish
-masukan gambar dibawah ini kedalam source package stopwatch berdampingan dengan stopwatch.java



-masukan script ini kedalam stopwatch.java

/*
 * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
 * All rights reserved. Use is subject to license terms.
 *
 * This file is available and licensed under the following license:
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the distribution.
 *  - Neither the name of Oracle Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package stopwatch;

import java.io.InputStream;
import java.text.DecimalFormat;
import javafx.animation.Animation.Status;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.VPos;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.GaussianBlur;
import javafx.scene.effect.Light;
import javafx.scene.effect.Lighting;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextBoundsType;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
 * This sample is an animated stopwatch. Click the green button to start the
 * stopwatch and click the red button to stop it.
 *
 * @see javafx.scene.effect.DropShadow
 * @see javafx.scene.effect.GaussianBlur
 * @see javafx.scene.effect.Light
 * @see javafx.scene.effect.Lighting
 * @see javafx.scene.image.Image
 * @see javafx.scene.image.ImageView
 * @see javafx.scene.shape.Circle
 * @see javafx.scene.Group
 * @see javafx.scene.shape.Ellipse
 * @see javafx.scene.shape.Rectangle
 * @see javafx.scene.text.Font
 * @see javafx.scene.text.Text
 * @see javafx.scene.text.TextAlignment
 * @see javafx.scene.text.TextBoundsType
 * @see javafx.scene.transform.Rotate
 * @see javafx.util.Duration
 *
 */
public class StopWatch extends Application {

    private Watch watch;

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root, 310, 320));
        watch = new Watch();
        myLayout();
        root.getChildren().add(watch);
    }

    private void myLayout() {
        watch.setLayoutX(15);
        watch.setLayoutY(20);
    }

    private class Watch extends Parent {
        //visual nodes

        private final Dial mainDial;
        private final Dial minutesDial;
        private final Dial tenthsDial;
        private final Group background = new Group();
        private final DigitalClock digitalClock = new DigitalClock();
        private final Button startButton;
        private final Button stopButton;
        /**
         * The number of milliseconds which have elapsed while the stopwatch has
         * been running. That is, it is the total time kept on the stopwatch.
         */
        private int elapsedMillis = 0;
        /**
         * Keeps track of the amount of the clock time (CPU clock) when the
         * stopwatch run plunger was pressed, or when the last tick even occurred.
         * This is used to calculate the elapsed time delta.
         */
        private int lastClockTime = 0;
        private DecimalFormat twoPlaces = new DecimalFormat("00");
        private Timeline time = new Timeline();

        public Watch() {
            startButton = new Button(Color.web("#8cc700"), Color.web("#71a000"));
            stopButton = new Button(Color.web("#AA0000"), Color.web("#660000"));

            mainDial = new Dial(117, true, 12, 60, Color.RED, true);
            minutesDial = new Dial(30, false, 12, 60, "minutes", Color.BLACK, false);
            tenthsDial = new Dial(30, false, 12, 60, "10ths", Color.BLACK, false);

            configureBackground();
            myLayout();
            configureListeners();
            configureTimeline();
            getChildren().addAll(background, minutesDial, tenthsDial, digitalClock, mainDial, startButton, stopButton);
        }

        private void configureTimeline() {
            time.setCycleCount(Timeline.INDEFINITE);
            KeyFrame keyFrame = new KeyFrame(Duration.millis(47), new EventHandler<ActionEvent>() {

                public void handle(ActionEvent event) {
                    calculate();
                }
            });
            time.getKeyFrames().add(keyFrame);
        }

        private void configureBackground() {
            ImageView imageView = new ImageView();
            Image image = loadImage();
            imageView.setImage(image);

            Circle circle1 = new Circle();
            circle1.setCenterX(140);
            circle1.setCenterY(140);
            circle1.setRadius(120);
            circle1.setFill(Color.TRANSPARENT);
            circle1.setStroke(Color.web("#0A0A0A"));
            circle1.setStrokeWidth(0.3);

            Circle circle2 = new Circle();
            circle2.setCenterX(140);
            circle2.setCenterY(140);
            circle2.setRadius(118);
            circle2.setFill(Color.TRANSPARENT);
            circle2.setStroke(Color.web("#0A0A0A"));
            circle2.setStrokeWidth(0.3);

            Circle circle3 = new Circle();
            circle3.setCenterX(140);
            circle3.setCenterY(140);
            circle3.setRadius(140);
            circle3.setFill(Color.TRANSPARENT);
            circle3.setStroke(Color.web("#818a89"));
            circle3.setStrokeWidth(1);

            Ellipse ellipse = new Ellipse(140, 95, 180, 95);
            Circle ellipseClip = new Circle(140, 140, 140);
            ellipse.setFill(Color.web("#535450"));
            ellipse.setStrokeWidth(0);
            GaussianBlur ellipseEffect = new GaussianBlur();
            ellipseEffect.setRadius(10);
            ellipse.setEffect(ellipseEffect);
            ellipse.setOpacity(0.1);
            ellipse.setClip(ellipseClip);
            background.getChildren().addAll(imageView, circle1, circle2, circle3, ellipse);
        }

        private void myLayout() {
            mainDial.setLayoutX(140);
            mainDial.setLayoutY(140);

            minutesDial.setLayoutX(100);
            minutesDial.setLayoutY(100);

            tenthsDial.setLayoutX(180);
            tenthsDial.setLayoutY(100);

            digitalClock.setLayoutX(79);
            digitalClock.setLayoutY(195);

            startButton.setLayoutX(223);
            startButton.setLayoutY(1);
            Rotate rotateRight = new Rotate(360 / 12);
            startButton.getTransforms().add(rotateRight);

            stopButton.setLayoutX(59.5);
            stopButton.setLayoutY(0);
            Rotate rotateLeft = new Rotate(-360 / 12);
            stopButton.getTransforms().add(rotateLeft);
        }

        private void configureListeners() {
            startButton.setOnMousePressed(new EventHandler<MouseEvent>() {

                public void handle(MouseEvent me) {
                    startButton.moveDown();
                    me.consume();
                }
            });

            stopButton.setOnMousePressed(new EventHandler<MouseEvent>() {

                public void handle(MouseEvent me) {
                    stopButton.moveDown();
                    me.consume();
                }
            });

            startButton.setOnMouseReleased(new EventHandler<MouseEvent>() {

                public void handle(MouseEvent me) {
                    startButton.moveUp();
                    startStop();
                    me.consume();
                }
            });

            stopButton.setOnMouseReleased(new EventHandler<MouseEvent>() {

                public void handle(MouseEvent me) {
                    stopButton.moveUp();
                    stopReset();
                    me.consume();
                }
            });

            startButton.setOnMouseDragged(new EventHandler<MouseEvent>() {

                public void handle(MouseEvent me) {
                    me.consume();
                }
            });

            stopButton.setOnMouseDragged(new EventHandler<MouseEvent>() {

                public void handle(MouseEvent me) {
                    me.consume();
                }
            });
        }

        //MODEL
        private void calculate() {
            if (lastClockTime == 0) {
                lastClockTime = (int) System.currentTimeMillis();
            }

            int now = (int) System.currentTimeMillis();
            int delta = now - lastClockTime;

            elapsedMillis += delta;

            int tenths = (elapsedMillis / 10) % 100;
            int seconds = (elapsedMillis / 1000) % 60;
            int mins = (elapsedMillis / 60000) % 60;

            refreshTimeDisplay(mins, seconds, tenths);

            lastClockTime = now;
        }

        public void startStop() {
            if (time.getStatus() != Status.STOPPED) {
                // if started, stop it
                time.stop();
                lastClockTime = 0;
            } else {
                // if stopped, restart
                time.play();
            }
        }

        public void stopReset() {
            if (time.getStatus() != Status.STOPPED) {
                // if started, stop it
                time.stop();
                lastClockTime = 0;
            } else {
                // if stopped, reset it
                lastClockTime = 0;
                elapsedMillis = 0;
                refreshTimeDisplay(0, 0, 0);
            }
        }

        private void refreshTimeDisplay(int mins, int seconds, int tenths) {
            double handAngle = ((360 / 60) * seconds);
            mainDial.setAngle(handAngle);

            double tenthsHandAngle = ((360 / 100.0) * tenths);
            tenthsDial.setAngle(tenthsHandAngle);

            double minutesHandAngle = ((360 / 60.0) * mins);
            minutesDial.setAngle(minutesHandAngle);

            String timeString = twoPlaces.format(mins) + ":" + twoPlaces.format(seconds) + "." + twoPlaces.format(tenths);
            digitalClock.refreshDigits(timeString);
        }

        //IMAGE handling
        public Image loadImage() {
            InputStream is = Watch.class.getResourceAsStream("stopwatch.png");
            return new Image(is);
        }
    }

    private class Dial extends Parent {
        private final double radius;
        private final Color color;
        private final Color FILL_COLOR = Color.web("#0A0A0A");
        private final Font NUMBER_FONT = new Font(16);
        private final Text name = new Text();
        private final Group hand = new Group();
        private final Group handEffectGroup = new Group(hand);
        private final DropShadow handEffect = new DropShadow();
        private int numOfMarks;
        private int numOfMinorMarks;

        public Dial(double radius, boolean hasNumbers, int numOfMarks, int numOfMinorMarks, Color color, boolean hasEffect) {
            this.color = color;
            this.radius = radius;
            this.numOfMarks = numOfMarks;
            this.numOfMinorMarks = numOfMinorMarks;

            configureHand();
            if (hasEffect) {
                configureEffect();
            }
            if (hasNumbers) {
                getChildren().add(createNumbers());
            }
            getChildren().addAll(
                    createTickMarks(),
                    handEffectGroup);
        }

        public Dial(double radius, boolean hasNumbers, int numOfMarks, int numOfMinorMarks, String name, Color color, boolean hasEffect) {
            this(radius, hasNumbers, numOfMarks, numOfMinorMarks, color, hasEffect);
            configureName(name);
            getChildren().add(this.name);
        }

        private Group createTickMarks() {
            Group group = new Group();

            for (int i = 0; i < numOfMarks; i++) {
                double angle = (360 / numOfMarks) * (i);
                group.getChildren().add(createTic(angle, radius / 10, 1.5));
            }

            for (int i = 0; i < numOfMinorMarks; i++) {
                double angle = (360 / numOfMinorMarks) * i;
                group.getChildren().add(createTic(angle, radius / 20, 1));
            }
            return group;
        }

        private Rectangle createTic(double angle, double width, double height) {
            Rectangle rectangle = new Rectangle(-width / 2, -height / 2, width, height);
            rectangle.setFill(Color.rgb(10, 10, 10));
            rectangle.setRotate(angle);
            rectangle.setLayoutX(radius * Math.cos(Math.toRadians(angle)));
            rectangle.setLayoutY(radius * Math.sin(Math.toRadians(angle)));
            return rectangle;
        }

        private void configureName(String string) {
            Font font = new Font(9);
            name.setText(string);
            name.setBoundsType(TextBoundsType.VISUAL);
            name.setLayoutX(-name.getBoundsInLocal().getWidth() / 2 + 4.8);
            name.setLayoutY(radius * 1 / 2 + 4);
            name.setFill(FILL_COLOR);
            name.setFont(font);
        }

        private Group createNumbers() {
            return new Group(
                    createNumber("30", -9.5, radius - 16 + 4.5),
                    createNumber("0", -4.7, -radius + 22),
                    createNumber("45", -radius + 10, 5),
                    createNumber("15", radius - 30, 5));
        }

        private Text createNumber(String number, double layoutX, double layoutY) {
            Text text = new Text(number);
            text.setLayoutX(layoutX);
            text.setLayoutY(layoutY);
            text.setTextAlignment(TextAlignment.CENTER);
            text.setFill(FILL_COLOR);
            text.setFont(NUMBER_FONT);
            return text;
        }

        public void setAngle(double angle) {
            Rotate rotate = new Rotate(angle);
            hand.getTransforms().clear();
            hand.getTransforms().add(rotate);
        }

        private void configureHand() {
            Circle circle = new Circle(0, 0, radius / 18);
            circle.setFill(color);
            Rectangle rectangle1 = new Rectangle(-0.5 - radius / 140, +radius / 7 - radius / 1.08, radius / 70 + 1, radius / 1.08);
            Rectangle rectangle2 = new Rectangle(-0.5 - radius / 140, +radius / 3.5 - radius / 7, radius / 70 + 1, radius / 7);
            rectangle1.setFill(color);
            rectangle2.setFill(Color.BLACK);
            hand.getChildren().addAll(circle, rectangle1, rectangle2);
        }

        private void configureEffect() {
            handEffect.setOffsetX(radius / 40);
            handEffect.setOffsetY(radius / 40);
            handEffect.setRadius(6);
            handEffect.setColor(Color.web("#000000"));

            Lighting lighting = new Lighting();
            Light.Distant light = new Light.Distant();
            light.setAzimuth(225);
            lighting.setLight(light);
            handEffect.setInput(lighting);

            handEffectGroup.setEffect(handEffect);
        }
    }

    private class DigitalClock extends Parent {

        private final HBox hBox = new HBox();
        public final Font FONT = new Font(16);
        private Text[] digits = new Text[8];
        private Group[] digitsGroup = new Group[8];
        private int[] numbers = {0, 1, 3, 4, 6, 7};

        DigitalClock() {
            configureDigits();
            configureDots();
            configureHbox();
            getChildren().addAll(hBox);
        }

        private void configureDigits() {
            for (int i : numbers) {
                digits[i] = new Text("0");
                digits[i].setFont(FONT);
                digits[i].setTextOrigin(VPos.TOP);
                digits[i].setLayoutX(2.3);
                digits[i].setLayoutY(-1);
                Rectangle background;
                if (i < 6) {
                    background = createBackground(Color.web("#a39f91"), Color.web("#FFFFFF"));
                    digits[i].setFill(Color.web("#000000"));
                } else {
                    background = createBackground(Color.web("#bdbeb3"), Color.web("#FF0000"));
                    digits[i].setFill(Color.web("#FFFFFF"));
                }
                digitsGroup[i] = new Group(background, digits[i]);
            }
        }

        private void configureDots() {
            digits[2] = createDot(":");
            digitsGroup[2] = new Group(createDotBackground(), digits[2]);
            digits[5] = createDot(".");
            digitsGroup[5] = new Group(createDotBackground(), digits[5]);
        }

        private Rectangle createDotBackground() {
            Rectangle background = new Rectangle(8, 17, Color.TRANSPARENT);
            background.setStroke(Color.TRANSPARENT);
            background.setStrokeWidth(2);
            return background;
        }

        private Text createDot(String string) {
            Text text = new Text(string);
            text.setFill(Color.web("#000000"));
            text.setFont(FONT);
            text.setTextOrigin(VPos.TOP);
            text.setLayoutX(1);
            text.setLayoutY(-4);
            return text;
        }

        private Rectangle createBackground(Color stroke, Color fill) {
            Rectangle background = new Rectangle(14, 17, fill);
            background.setStroke(stroke);
            background.setStrokeWidth(2);
            background.setEffect(new Lighting());
            background.setCache(true);
            return background;
        }

        private void configureHbox() {
            hBox.getChildren().addAll(digitsGroup);
            hBox.setSpacing(1);
        }

        public void refreshDigits(String time) { //expecting time in format "xx:xx:xx"
            for (int i = 0; i < digits.length; i++) {
                digits[i].setText(time.substring(i, i + 1));
            }
        }
    }

    private class Button extends Parent {
        private final Color colorWeak;
        private final Color colorStrong;
        private final Rectangle rectangleSmall = new Rectangle(14, 7);
        private final Rectangle rectangleBig = new Rectangle(28, 5);
        private final Rectangle rectangleWatch = new Rectangle(24, 14);
        private final Rectangle rectangleVisual = new Rectangle(28, 7 + 5 + 14);

        Button(Color colorWeak, Color colorStrong) {
            this.colorStrong = colorStrong;
            this.colorWeak = colorWeak;
            configureDesign();
            setCursor(Cursor.HAND);
            getChildren().addAll(rectangleVisual, rectangleSmall, rectangleBig, rectangleWatch);
        }

        private void configureDesign() {
            rectangleVisual.setLayoutY(0f);
            rectangleVisual.setLayoutX(-14);
            rectangleVisual.setFill(Color.TRANSPARENT);

            rectangleSmall.setLayoutX(-7);
            rectangleSmall.setLayoutY(5);
            rectangleSmall.setFill(new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, new Stop[]{
                        new Stop(0, colorWeak),
                        new Stop(0.5, colorStrong),
                        new Stop(1, colorWeak)}));

            rectangleBig.setLayoutX(-14);
            rectangleBig.setLayoutY(0);
            rectangleBig.setFill(new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, new Stop[]{
                        new Stop(0, colorStrong),
                        new Stop(0.5, colorWeak),
                        new Stop(1, colorStrong)}));

            rectangleWatch.setFill(new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, new Stop[]{
                        new Stop(0, Color.web("#4e605f")),
                        new Stop(0.2, Color.web("#c3d6d5")),
                        new Stop(0.5, Color.web("#f9ffff")),
                        new Stop(0.8, Color.web("#c3d6d5")),
                        new Stop(1, Color.web("#4e605f"))}));
            rectangleWatch.setLayoutX(-12);
            rectangleWatch.setLayoutY(12);
        }

        private void move(double smallRectHeight) {
            rectangleSmall.setHeight(smallRectHeight);
            rectangleSmall.setTranslateY(7 - smallRectHeight);
            rectangleBig.setTranslateY(7 - smallRectHeight);
        }

        public void moveDown() {
            move(0);
        }

        public void moveUp() {
            move(7);
        }
    }


    @Override public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }

    /**
     * The main() method is ignored in correctly deployed JavaFX
     * application. main() serves only as fallback in case the
     * application can not be launched through deployment artifacts,
     * e.g., in IDEs with limited FX support. NetBeans ignores main().
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

Tuesday, June 7, 2016

pbo

Tugas PBO 2 buat project Tetris

buat 3 java class

Board.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Tetris;

import Tetris.Shape.Tetrominoes;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 *
 * @author ITDEV08
 */
public class Board extends JPanel implements ActionListener{

    final int BoardWidth = 10;
    final int BoardHeight = 22;

    Timer timer;
    boolean isFallingFinished = false;
    boolean isStarted = false;
    boolean isPaused = false;
    int numLinesRemoved = 0;
    int curX = 0;
    int curY = 0;
    JLabel statusbar;
    Shape curPiece;
    Tetrominoes[] board;

    public Board(Tetris parent) {

        setFocusable(true);
        curPiece = new Shape();
        timer = new Timer(400, this);
        timer.start();

        statusbar = parent.getStatusBar();
        board = new Tetrominoes[BoardWidth * BoardHeight];
        addKeyListener(new TAdapter());
        clearBoard();
    }

    public void actionPerformed(ActionEvent e) {
        if (isFallingFinished) {
            isFallingFinished = false;
            newPiece();
        } else {
            oneLineDown();
        }
    }

    int squareWidth() {
        return (int) getSize().getWidth() / BoardWidth;
    }

    int squareHeight() {
        return (int) getSize().getHeight() / BoardHeight;
    }

    Tetrominoes shapeAt(int x, int y) {
        return board[(y * BoardWidth) + x];
    }

    public void start() {
        if (isPaused) {
            return;
        }

        isStarted = true;
        isFallingFinished = false;
        numLinesRemoved = 0;
        clearBoard();

        newPiece();
        timer.start();
    }

    private void pause() {
        if (!isStarted) {
            return;
        }

        isPaused = !isPaused;
        if (isPaused) {
            timer.stop();
            statusbar.setText("Paused");
        } else {
            timer.start();
            statusbar.setText(String.valueOf(numLinesRemoved));
        }
        repaint();
    }

    public void paint(Graphics g) {
        super.paint(g);

        Dimension size = getSize();
        int boardTop = (int) size.getHeight() - BoardHeight * squareHeight();

        for (int i = 0; i < BoardHeight; ++i) {
            for (int j = 0; j < BoardWidth; ++j) {
                Tetrominoes shape = shapeAt(j, BoardHeight - i - 1);
                if (shape != Tetrominoes.NoShape) {
                    drawSquare(g, 0 + j * squareWidth(),
                            boardTop + i * squareHeight(), shape);
                }
            }
        }

        if (curPiece.getShape() != Tetrominoes.NoShape) {
            for (int i = 0; i < 4; ++i) {
                int x = curX + curPiece.x(i);
                int y = curY - curPiece.y(i);
                drawSquare(g, 0 + x * squareWidth(),
                        boardTop + (BoardHeight - y - 1) * squareHeight(),
                        curPiece.getShape());
            }
        }
    }

    private void dropDown() {
        int newY = curY;
        while (newY > 0) {
            if (!tryMove(curPiece, curX, newY - 1)) {
                break;
            }
            --newY;
        }
        pieceDropped();
    }

    private void oneLineDown() {
        if (!tryMove(curPiece, curX, curY - 1)) {
            pieceDropped();
        }
    }

    private void clearBoard() {
        for (int i = 0; i < BoardHeight * BoardWidth; ++i) {
            board[i] = Tetrominoes.NoShape;
        }
    }

    private void pieceDropped() {
        for (int i = 0; i < 4; ++i) {
            int x = curX + curPiece.x(i);
            int y = curY - curPiece.y(i);
            board[(y * BoardWidth) + x] = curPiece.getShape();
        }

        removeFullLines();

        if (!isFallingFinished) {
            newPiece();
        }
    }

    private void newPiece() {
        curPiece.setRandomShape();
        curX = BoardWidth / 2 + 1;
        curY = BoardHeight - 1 + curPiece.minY();

        if (!tryMove(curPiece, curX, curY)) {
            curPiece.setShape(Tetrominoes.NoShape);
            timer.stop();
            isStarted = false;
            statusbar.setText("game over");
        }
    }

    private boolean tryMove(Shape newPiece, int newX, int newY) {
        for (int i = 0; i < 4; ++i) {
            int x = newX + newPiece.x(i);
            int y = newY - newPiece.y(i);
            if (x < 0 || x >= BoardWidth || y < 0 || y >= BoardHeight) {
                return false;
            }
            if (shapeAt(x, y) != Tetrominoes.NoShape) {
                return false;
            }
        }

        curPiece = newPiece;
        curX = newX;
        curY = newY;
        repaint();
        return true;
    }

    private void removeFullLines() {
        int numFullLines = 0;

        for (int i = BoardHeight - 1; i >= 0; --i) {
            boolean lineIsFull = true;

            for (int j = 0; j < BoardWidth; ++j) {
                if (shapeAt(j, i) == Tetrominoes.NoShape) {
                    lineIsFull = false;
                    break;
                }
            }

            if (lineIsFull) {
                ++numFullLines;
                for (int k = i; k < BoardHeight - 1; ++k) {
                    for (int j = 0; j < BoardWidth; ++j) {
                        board[(k * BoardWidth) + j] = shapeAt(j, k + 1);
                    }
                }
            }
        }

        if (numFullLines > 0) {
            numLinesRemoved += numFullLines;
            statusbar.setText(String.valueOf(numLinesRemoved));
            isFallingFinished = true;
            curPiece.setShape(Tetrominoes.NoShape);
            repaint();
        }
    }

    private void drawSquare(Graphics g, int x, int y, Tetrominoes shape) {
        Color colors[] = {new Color(0, 0, 0), new Color(204, 102, 102),
            new Color(102, 204, 102), new Color(102, 102, 204),
            new Color(204, 204, 102), new Color(204, 102, 204),
            new Color(102, 204, 204), new Color(218, 170, 0)
        };

        Color color = colors[shape.ordinal()];

        g.setColor(color);
        g.fillRect(x + 1, y + 1, squareWidth() - 2, squareHeight() - 2);

        g.setColor(color.brighter());
        g.drawLine(x, y + squareHeight() - 1, x, y);
        g.drawLine(x, y, x + squareWidth() - 1, y);

        g.setColor(color.darker());
        g.drawLine(x + 1, y + squareHeight() - 1,
                x + squareWidth() - 1, y + squareHeight() - 1);
        g.drawLine(x + squareWidth() - 1, y + squareHeight() - 1,
                x + squareWidth() - 1, y + 1);

    }

    class TAdapter extends KeyAdapter {

        public void keyPressed(KeyEvent e) {

            if (!isStarted || curPiece.getShape() == Tetrominoes.NoShape) {
                return;
            }

            int keycode = e.getKeyCode();

            if (keycode == 'p' || keycode == 'P') {
                pause();
                return;
            }

            if (isPaused) {
                return;
            }

            switch (keycode) {
                case KeyEvent.VK_LEFT:
                    tryMove(curPiece, curX - 1, curY);
                    break;
                case KeyEvent.VK_RIGHT:
                    tryMove(curPiece, curX + 1, curY);
                    break;
                case KeyEvent.VK_DOWN:
                    tryMove(curPiece.rotateRight(), curX, curY);
                    break;
                case KeyEvent.VK_UP:
                    tryMove(curPiece.rotateLeft(), curX, curY);
                    break;
                case KeyEvent.VK_SPACE:
                    dropDown();
                    break;
                case 'd':
                    oneLineDown();
                    break;
                case 'D':
                    oneLineDown();
                    break;
            }

        }
    }

}





Shape.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Tetris;

import java.util.Random;

/**
 *
 * @author ITDEV08
 */
public class Shape {

    enum Tetrominoes {

        NoShape, ZShape, SShape, LineShape,
        TShape, SquareShape, LShape, MirroredLShape
    };

    private Tetrominoes pieceShape;
    private int coords[][];
    private int[][][] coordsTable;

    public Shape() {

        coords = new int[4][2];
        setShape(Tetrominoes.NoShape);

    }

    public void setShape(Tetrominoes shape) {

        coordsTable = new int[][][]{
            {{0, 0}, {0, 0}, {0, 0}, {0, 0}},
            {{0, -1}, {0, 0}, {-1, 0}, {-1, 1}},
            {{0, -1}, {0, 0}, {1, 0}, {1, 1}},
            {{0, -1}, {0, 0}, {0, 1}, {0, 2}},
            {{-1, 0}, {0, 0}, {1, 0}, {0, 1}},
            {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
            {{-1, -1}, {0, -1}, {0, 0}, {0, 1}},
            {{1, -1}, {0, -1}, {0, 0}, {0, 1}}
        };

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 2; ++j) {
                coords[i][j] = coordsTable[shape.ordinal()][i][j];
            }
        }
        pieceShape = shape;

    }

    private void setX(int index, int x) {
        coords[index][0] = x;
    }

    private void setY(int index, int y) {
        coords[index][1] = y;
    }

    public int x(int index) {
        return coords[index][0];
    }

    public int y(int index) {
        return coords[index][1];
    }

    public Tetrominoes getShape() {
        return pieceShape;
    }

    public void setRandomShape() {
        Random r = new Random();
        int x = Math.abs(r.nextInt()) % 7 + 1;
        Tetrominoes[] values = Tetrominoes.values();
        setShape(values[x]);
    }

    public int minX() {
        int m = coords[0][0];
        for (int i = 0; i < 4; i++) {
            m = Math.min(m, coords[i][0]);
        }
        return m;
    }

    public int minY() {
        int m = coords[0][1];
        for (int i = 0; i < 4; i++) {
            m = Math.min(m, coords[i][1]);
        }
        return m;
    }

    public Shape rotateLeft() {
        if (pieceShape == Tetrominoes.SquareShape) {
            return this;
        }

        Shape result = new Shape();
        result.pieceShape = pieceShape;

        for (int i = 0; i < 4; ++i) {
            result.setX(i, y(i));
            result.setY(i, -x(i));
        }
        return result;
    }

    public Shape rotateRight() {
        if (pieceShape == Tetrominoes.SquareShape) {
            return this;
        }

        Shape result = new Shape();
        result.pieceShape = pieceShape;

        for (int i = 0; i < 4; ++i) {
            result.setX(i, -y(i));
            result.setY(i, x(i));
        }
        return result;
    }
}



Tetris.java


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Tetris;

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 *
 * @author ITDEV08
 */
public class Tetris extends JFrame{
    JLabel statusbar;

    public Tetris() {

        statusbar = new JLabel(" 0");
        add(statusbar, BorderLayout.SOUTH);
        Board board = new Board(this);
        add(board);
        board.start();

        setSize(200, 400);
        setTitle("Tetris");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
   }

   public JLabel getStatusBar() {
       return statusbar;
   }

    public static void main(String[] args) {

        Tetris game = new Tetris();
        game.setLocationRelativeTo(null);
        game.setVisible(true);

    } 
}

Original VS Pirated? Solusi bagi user dan developer

Bagi para developer melihat sesuatu dengan uang diakhir, yang artinya investasi diawal(uang, tenaga, waktu) untuk mendapatkan sebuah pendapa...