0

JavaFX Property & Bindings Part-4 Örnek Uygulama

Merhaba arkadaşlar 3 bölümde izah etmeye çalıştığım konuya bir nihayet vermek için Javafx 9 by Example kitabından aldığım bu örneği Türkçe açıklamaları ile birlikte yapıyorum. Hem lambda Expression , hem property kullanımını güzel bir şekilde anlatan bir uygulama.  Kodları paylaşıyorum kodların üzerinde ne işe yaradıklarına dair açıklama satırları var ayrıca user sınıfıda altta,  uygulamanın gerçek çalışma görüntüsünü de videoda. Ayrıca yazının sonuna basit örnek daha ekledim.  herkese kolay gelsin.

package sample;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.layout.*;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.sql.SQLOutput;


public class FormValidation extends Application {


    private final static String MY_PASS="password1";
    private final static BooleanProperty GRANTED_ACCESS=new SimpleBooleanProperty();
    private final static int MAX_ATTEMPS=3;
    private final IntegerProperty ATTEMPS=new SimpleIntegerProperty();


    public void start(Stage primaryStage) throws Exception {

        // Yeni bir user nesnesi oluşturalım
        final User user=new User();

        // Stage'mizi transparan yapalım
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setAlwaysOnTop(true);

        // root nesnesi oluşturup Sahnemizi oluşturalım
        Group root=new Group();
        Scene scene=new Scene(root,320,115,null);

        // stil.css dosyamızı projemize ekleyelim
        scene.getStylesheets().add(getClass()
                .getResource("/stil.css")
                .toExternalForm()
        );

        primaryStage.setScene(scene);

        //Arka plana bir rounded Rectangle koyacağız
        Rectangle background=new Rectangle();
        background.setId("background-rect");
        background.widthProperty().bind(scene.widthProperty().subtract(5));
        background.heightProperty().bind(scene.heightProperty().subtract(5));

        //username'yi readOnly bir property tuttuğundan
        Label userName=new Label();
        userName.setId("username");
        userName.textProperty().bind(user.userNameProperty());

        HBox userNameCell=new HBox();
        userNameCell.getChildren().add(userName);

        // Eğer kullanıcı adı arkaplan olarak kullandığımız dikdörtgenden
        // uzun olursa kilit resmini kapatacaktır onun için şöyle bir önlem alıyoruz

        userNameCell.maxWidthProperty().bind(primaryStage.widthProperty().subtract(45));
        userNameCell.prefWidthProperty().bind(primaryStage.widthProperty().subtract(45));

        // kilit resmi alanını ekleyelim
        // Region kullanma amacımız daha çok css özelliklerini destemelesi

        Region padLock=new Region();
        padLock.setId("padlock");

        HBox padLockCell=new HBox();
        padLockCell.setId("padLockCell");
        HBox.setHgrow(padLockCell, Priority.ALWAYS);
        padLockCell.getChildren().add(padLock);


        // İlk satırı oluşturalım

        HBox row1=new HBox();
        row1.getChildren().addAll(userNameCell,padLockCell);


        //password textField'ini oluşturalım
        PasswordField passwordField=new PasswordField();
        passwordField.setId("password-field");
        passwordField.setPromptText("Password");
        passwordField.prefWidthProperty().bind(primaryStage.widthProperty().subtract(55));


        //password alanına girelen değeri user nesnesinin passwordproperty'sine bağlayalım
        user.passwordProperty().bind(passwordField.textProperty());

        // error icon alanı
        final Region deniedIcon=new Region();
        deniedIcon.setId("denied-icon");
        deniedIcon.setVisible(false);

        // Uygun iconu için alanı oluşturalım
        Region grantedIcon=new Region();
        grantedIcon.setId("granted-icon");
        grantedIcon.visibleProperty().bind(GRANTED_ACCESS);

        // Uygun ve Hata ikonları için gösterme gizleme yapısını kuralım
        StackPane accessIndicator=new StackPane();
        accessIndicator.getChildren().addAll(deniedIcon,grantedIcon);

        // İkinci Satırı oluşturalım
        HBox row2=new HBox();
        row2.getChildren().addAll(passwordField,accessIndicator);
        HBox.setHgrow(accessIndicator, Priority.ALWAYS);
        // passwordField kaplayacağı alanı kaplıyor kalan kısmı accessIndicator kaplıyor


        // Kullanıcı passwordField üzerinde Enter tuşuna basınca olacakları yapalım
        passwordField.setOnAction(event -> {
            if(GRANTED_ACCESS.get()){
                System.out.printf("Kulanıcı %s geçerli bir kullanıcı \n",user.getUserName());
                System.out.printf("Kullanıcı %s geçerli bir şifre girdi şifre:%s\n ");
                Platform.exit();
            }
            else{
                deniedIcon.setVisible(true);
                ATTEMPS.set(ATTEMPS.add(1).get());
            }
        });

        // Kullanıcı passwordField'e birşeyler yazınca bu yazdıklarını bir listener
        // ile yakalayalım.
        passwordField.textProperty().addListener((observable,oldValue,newValue)->{
            GRANTED_ACCESS.set(passwordField.getText().equals(MY_PASS));
            if(GRANTED_ACCESS.get()){
                deniedIcon.setVisible(false);
            }

        });


        // Kullanıcının şifre denemeleri için bir listener oluşturalım
        ATTEMPS.addListener((observable, oldValue, newValue) -> {

            // geçersiz şifre için
            System.out.println("Şifre Denemeleri : "+ATTEMPS.get());
            if(MAX_ATTEMPS==newValue.intValue()){
                System.out.printf("%s geçersiz bir kullanıcı \n",user.getUserName());
                Platform.exit();

            }
        });

        // Ana form yapısını oluşturalım

        VBox formLayout=new VBox(4);
        formLayout.getChildren().addAll(row1,row2);
        formLayout.setLayoutX(12);
        formLayout.setLayoutY(12);

        root.getChildren().addAll(background,formLayout);

        primaryStage.show();

    }
}
package sample;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class User {

    StringProperty userName=new SimpleStringProperty();

    public User() {
      this.setUserName("Veysel SARI");
    }

    public String getPassword() {
        return password.get();
    }

    public StringProperty passwordProperty() {
        return password;
    }

    public void setPassword(String password) {
        this.password.set(password);
    }

    StringProperty password=new SimpleStringProperty();

    public String getUserName() {
        return userName.get();
    }

    public StringProperty userNameProperty() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName.set(userName);
    }
}

stil.css

.root {
    common-foreground-color: rgb(255, 255, 255, 0.90);
}
#background-rect {
    -fx-translate-x: 5px;
    -fx-translate-y: 5px;
    -fx-arc-height: 15;
    -fx-arc-width: 15;
    -fx-fill: rgba(0, 0, 0, .55);
    -fx-stroke: common-foreground-color;
    -fx-stroke-width: 1.5;
}
#username {
    -fx-font-family: "Helvetica";
    -fx-font-weight: bold;
    -fx-font-size: 30;
    -fx-text-fill: common-foreground-color;
    -fx-smooth: true;
}
#padLockCell {
    -fx-alignment: center-right;
}
#padlock {
    -fx-position-shape: true;
    -fx-padding: 0 0 0 20;
    -fx-scale-shape: false;
    -fx-background-color: common-foreground-color;
    -fx-shape: "M24.875,15.334v-4.876c0-4.894-3.981-8.875-8.875-8.875s-8.875,3.981-8.875,
    8.875v4.876H5.042v15.083h21.916V15.334H24.875zM10.625,10.458c0-2.964,
    2.411-5.375,5.375-5.375s5.375,2.411,5.375,5.375v4.876h-10.75V10.458zM18.272,
    26.956h-4.545l1.222-3.667c-0.782-0.389-1.324-1.188-1.324-2.119c0-1.312,
    1.063-2.375,2.375-2.375s2.375,1.062,2.375,2.375c0,0.932-0.542,1.73-1.324,
    2.119L18.272,26.956z";
}
#denied-icon {
    -fx-position-shape: true;
    -fx-padding: 0 0 0 20;
    -fx-scale-shape: false;
    -fx-border-color: white;
    -fx-background-color: rgba(255, 0, 0, .9);
    -fx-shape: "M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,
    7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,
    18.746 21.948,24.248z";
}
#granted-icon {
    -fx-position-shape: true;
    -fx-padding: 0 0 0 20;
    -fx-scale-shape: false;
    -fx-border-color: white;
    -fx-background-color: rgba(0, 255, 0, .9);
    -fx-shape: "M2.379,14.729 5.208,11.899 12.958,19.648 25.877,6.733 28.707,
    9.561 12.958,25.308z";
}
#password-field {
    -fx-font-family: "Helvetica";
    -fx-font-size: 20;
    -fx-text-fill:black;
    -fx-prompt-text-fill:gray;
    -fx-highlight-text-fill:black;
    -fx-highlight-fill: gray;
    -fx-background-color: rgba(255, 255, 255, .80);
}

Evet başka bir basit örnek daha yapalım. Medusafx jar dosyasını buradan indirip projenize ekliyelim. https://bintray.com/hansolo/Medusa/Medusa

package sample;

import eu.hansolo.medusa.*;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.Stop;
import javafx.stage.Stage;



public class GaugeSlider extends Application {


    @Override
    public void start(Stage primaryStage) throws Exception {


        Gauge gauge =
                GaugeBuilder.create()
                        .skinType(Gauge.SkinType.GAUGE)                                                        // Skin for your Gauge
                        .prefSize(500,500)                                                               // Preferred size of control
                        // Related to Foreground Elements
                        .foregroundBaseColor(Color.BLACK)                                                // Color for title, subtitle, unit, value, tick label, zeroColor, tick mark, major tick mark, medium tick mark and minor tick mark
                        // Related to Title Text
                        .title("Title")                                                                  // Text for title
                        .titleColor(Color.BLACK)                                                         // Color for title text
                        // Related to Sub Title Text
                        .subTitle("SubTitle")                                                            // Text for subtitle
                        .subTitleColor(Color.BLACK)                                                      // Color for subtitle text
                        // Related to Unit Text
                        .unit("Unit")                                                                    // Text for unit
                        .unitColor(Color.BLACK)                                                          // Color for unit text
                        // Related to Value Text
                        .valueColor(Color.BLACK)                                                         // Color for value text
                        .decimals(0)                                                                     // Number of decimals for the value/lcd text
                        // Related to LCD
                        .lcdVisible(false)                                                               // LCD instead of the plain value text
                        .lcdDesign(LcdDesign.STANDARD)                                                   // Design for LCD
                        .lcdFont(LcdFont.DIGITAL_BOLD)                                                   // Font for LCD (STANDARD, LCD, DIGITAL, DIGITAL_BOLD, ELEKTRA)
                        // Related to scale
                        .scaleDirection(Gauge.ScaleDirection.CLOCKWISE)                                        // Direction of Scale (CLOCKWISE, COUNTER_CLOCKWISE)
                        .minValue(0)                                                                     // Start value of Scale
                        .maxValue(100)                                                                   // End value of Scale
                        .startAngle(320)                                                                 // Start angle of Scale (bottom -> 0, direction -> CCW)
                        .angleRange(280)                                                                 // Angle range of Scale starting from the start angle
                        // Related to Tick Labels
                        .tickLabelDecimals(0)                                                            // Number of decimals for tick labels
                        .tickLabelLocation(TickLabelLocation.INSIDE)                                     // Should tick labels be inside or outside Scale (INSIDE, OUTSIDE)
                        .tickLabelOrientation(TickLabelOrientation.HORIZONTAL)                           // Orientation of tick labels (ORTHOGONAL,  HORIZONTAL, TANGENT)
                        .onlyFirstAndLastTickLabelVisible(false)                                         // Should only the first and last tick label be visible
                                                                // Should sections for tick labels be visible
                                                                  // Sections to color tick marks
                        // Related to Major Tick Marks
                        .majorTickMarksVisible(true)                                                     // Should major tick marks be visible
                        .majorTickMarkType(TickMarkType.LINE)                                            // Tick mark type for major tick marks (LINE, DOT, TRIANGLE, TICK_LABEL)
                        .majorTickMarkColor(Color.BLACK)                                                 // Color for major tick marks (overriden by tick mark sections)
                        // Related to Medium Tick Marks
                        .mediumTickMarksVisible(true)                                                    // Should medium tick marks be visible
                        .mediumTickMarkType(TickMarkType.LINE)                                           // Tick mark type for medium tick marks (LINE, DOT, TRIANGLE)
                        .mediumTickMarkColor(Color.BLACK)                                                // Color for medium tick marks (overriden by tick mark sections)
                        // Related to Minor Tick Marks
                        .minorTickMarksVisible(true)                                                     // Should minor tick marks be visible
                        .minorTickMarkType(TickMarkType.LINE)                                            // Tick mark type for minor tick marks (LINE, DOT, TRIANGLE)
                        .minorTickMarkColor(Color.BLACK)                                                 // Color for minor tick marks (override by tick mark sections)
                        // Related to LED
                        .ledVisible(false)                                                               // Should LED be visible
                        .ledType(Gauge.LedType.STANDARD)                                                       // Type of the LED (STANDARD, FLAT)
                        .ledColor(Color.rgb(255, 200, 0))                                                // Color of LED
                        .ledBlinking(false)                                                              // Should LED blink
                        .ledOn(false)                                                                    // LED on or off
                        // Related to Needle
                        .needleShape(Gauge.NeedleShape.ANGLED)                                                 // Shape of needle (ANGLED, ROUND, FLAT)
                        .needleSize(Gauge.NeedleSize.STANDARD)                                                 // Size of needle (THIN, STANDARD, THICK)
                        .needleColor(Color.CRIMSON)                                                      // Color of needle
                        // Related to Needle behavior
                        .startFromZero(false)                                                            // Should needle start from the 0 value
                        .returnToZero(false)                                                             // Should needle return to the 0 value (only makes sense when animated==true)
                        // Related to Knob
                        .knobType(Gauge.KnobType.STANDARD)                                                     // Type for center knob (STANDARD, PLAIN, METAL, FLAT)
                        .knobColor(Color.LIGHTGRAY)                                                      // Color of center knob
                        .interactive(false)                                                              // Should center knob be act as button
                        .onButtonPressed(buttonEvent -> System.out.println("Knob pressed"))              // Handler (triggered when the center knob was pressed)
                        .onButtonReleased(buttonEvent -> System.out.println("Knob released"))            // Handler (triggered when the center knob was released)
                        // Related to Threshold
                        .thresholdVisible(false)                                                         // Should threshold indicator be visible
                        .threshold(50)                                                                   // Value of threshold
                        .thresholdColor(Color.RED)                                                       // Color of threshold indicator
                        .checkThreshold(false)                                                           // Should each value be checked against threshold
                        .onThresholdExceeded(thresholdEvent -> System.out.println("Threshold exceeded")) // Handler (triggered if checkThreshold==true and the threshold is exceeded)
                        .onThresholdUnderrun(thresholdEvent -> System.out.println("Threshold underrun")) // Handler (triggered if checkThreshold==true and the threshold is underrun)
                        // Related to Gradient Bar
                        .gradientBarEnabled(false)                                                       // Should gradient filled bar be visible to visualize a range
                        .gradientBarStops(new Stop(0.0, Color.BLUE),                                     // Color gradient that will be use to color fill bar
                                new Stop(0.25, Color.CYAN),
                                new Stop(0.5, Color.LIME),
                                new Stop(0.75, Color.YELLOW),
                                new Stop(1.0, Color.RED))
                                                                          // Sections that will be drawn (won't be drawn if colorGradientEnabled==true)
                        .checkSectionsForValue(false)                                                    // Should each section be checked against current value (if true section events will be fired)
                        // Related to Areas
                                                                        // Areas that will be drawn
                        // Related to Markers
                        .markersVisible(false)                                                           // Should markers be visible
                                                                             // Markers that will be drawn
                        // Related to Value
                        .animated(false)                                                                 // Should needle be animated
                        .animationDuration(500)                                                          // Speed of needle in milliseconds (10 - 10000 ms)
                        .onValueChanged(o -> System.out.println(((DoubleProperty) o).get()))             // InvalidationListener (triggered each time the value changed)
                        .build();

        Group root=new Group();

        VBox vBox=new VBox(10);
        Slider slider=new Slider();
        slider.setMin(0);
        slider.setMax(100);
        slider.setShowTickMarks(true);
        slider.setShowTickLabels(true);
        vBox.getChildren().addAll(gauge,slider);
        gauge.valueProperty().bind(slider.valueProperty());


        root.getChildren().addAll(vBox);
        Scene scene=new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Property & Bind - Gauge Örnek");
        primaryStage.show();

    }
}

DovizkuruUygulaması indirmekiçin tıklayın

admin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir