openplanning

Hướng dẫn và ví dụ JavaFX Button

  1. JavaFX Button
  2. Ví dụ với Button
  3. Button và sự kiện
  4. Áp dụng hiệu ứng cho Button
  5. Kiểu dáng Button (Css Style)

1. JavaFX Button

JavaFX Button cho phép các nhà phát triển xử lý một hành động khi người dùng nhấp chuột vào một nút. Các lớp Button là một class mở rộng từ class Labeled. Nó có thể hiển thị văn bản, hình ảnh, hoặc cả hai

2. Ví dụ với Button

Tạo một Button với Text, hoặc Image hoặc cả hai.
InputStream input =              
      getClass().getResourceAsStream("/org/o7planning/javafx/icon/java-32.png");

Image image = new Image(input);
ImageView imageView = new ImageView(image);

// Tạo button với Text & Image từ Constructor
Button button2 = new Button("Button with Text & Image", imageView);

// Hoặc
Button button2 = new Button("Button with Text & Image");
button2.setGraphic(imageView);
Xem ví dụ đầy đủ:
ButtonDemo.java
package org.o7planning.javafx.button;

import java.io.InputStream;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class ButtonDemo extends Application {

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

        FlowPane root = new FlowPane();
        root.setPadding(new Insets(10));
        root.setHgap(10);
        root.setVgap(10);

        // Button 1
        Button button1 = new Button("Button with Text");

        InputStream input = //
                getClass().getResourceAsStream("/org/o7planning/javafx/icon/java-32.png");

        Image image = new Image(input);
        ImageView imageView = new ImageView(image);

        Button button2 = new Button("Button with Text & Image");
        button2.setGraphic(imageView);

        root.getChildren().addAll(button1, button2);

        primaryStage.setTitle("Java Button (o7planning.org)");

        Scene scene = new Scene(root, 350, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

}

3. Button và sự kiện

Các chức năng chính của mỗi nút là để tạo ra một hành động khi nó được click. Sử dụng phương thức setOnAction của class Button để xác định những gì sẽ xảy ra khi người dùng nhấp vào nút.
button.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        label.setText(new Date().toString());
    }
});
Ngoài ra Button là một Node, nó thừa kế tất cả các phương thức sử lý sự kiện từ lớp Node.
** Node **
public final void setOnDragEntered(EventHandler<? super DragEvent> value)
public final void setOnDragExited(EventHandler<? super DragEvent> value)
public final void setOnDragOver(EventHandler<? super DragEvent> value)
public final void setOnDragDropped(EventHandler<? super DragEvent> value)
public final void setOnDragDone(EventHandler<? super DragEvent> value)
public final void setOnContextMenuRequested(EventHandler<? super ContextMenuEvent> value)
public final void setOnMouseClicked(EventHandler<? super MouseEvent> value)
public final void setOnMouseDragged(EventHandler<? super MouseEvent> value)
public final void setOnMouseEntered(EventHandler<? super MouseEvent> value)
public final void setOnMouseExited(EventHandler<? super MouseEvent> value)
public final void setOnMouseMoved(EventHandler<? super MouseEvent> value)
public final void setOnMousePressed(EventHandler<? super MouseEvent> value)
public final void setOnMouseReleased(EventHandler<? super MouseEvent> value)
public final void setOnDragDetected(EventHandler<? super MouseEvent> value)
public final void setOnMouseDragOver(EventHandler<? super MouseDragEvent> value)
public final void setOnMouseDragReleased(EventHandler<? super MouseDragEvent> value)
public final void setOnMouseDragEntered(EventHandler<? super MouseDragEvent> value)
public final void setOnMouseDragExited(EventHandler<? super MouseDragEvent> value)
public final void setOnScrollStarted(EventHandler<? super ScrollEvent> value)
public final void setOnScroll(EventHandler<? super ScrollEvent> value)
public final void setOnScrollFinished(EventHandler<? super ScrollEvent> value)
public final void setOnRotationStarted(EventHandler<? super RotateEvent> value)
public final void setOnRotate(EventHandler<? super RotateEvent> value)
public final void setOnRotationFinished(EventHandler<? super RotateEvent> value)
public final void setOnZoomStarted(EventHandler<? super ZoomEvent> value)
public final void setOnZoom(EventHandler<? super ZoomEvent> value)
public final void setOnZoomFinished(EventHandler<? super ZoomEvent> value)
public final void setOnSwipeUp(EventHandler<? super SwipeEvent> value)
public final void setOnSwipeDown(EventHandler<? super SwipeEvent> value)
public final void setOnSwipeLeft(EventHandler<? super SwipeEvent> value)
public final void setOnSwipeRight(EventHandler<? super SwipeEvent> value)
public final void setOnTouchPressed(EventHandler<? super TouchEvent> value)
public final void setOnTouchMoved(EventHandler<? super TouchEvent> value)
public final void setOnTouchReleased(EventHandler<? super TouchEvent> value)
public final void setOnTouchStationary(EventHandler<? super TouchEvent> value)
public final void setOnKeyPressed(EventHandler<? super KeyEvent> value)
public final void setOnKeyReleased(EventHandler<? super KeyEvent> value)
public final void setOnKeyTyped(EventHandler<? super KeyEvent> value
public final void setOnInputMethodTextChanged(EventHandler<? super InputMethodEvent> value)
Ví dụ xử lý một hành động xẩy ra với Button.
ButtonEventDemo.java
package org.o7planning.javafx.button;

import java.util.Date;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class ButtonEventDemo extends Application {

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

        FlowPane root = new FlowPane();
        root.setPadding(new Insets(10));
        root.setHgap(10);
        root.setVgap(10);

        // Button
        Button button = new Button("Show Time");
        Label label = new Label("");

        button.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                label.setText(new Date().toString());
            }
        });

        root.getChildren().addAll(button,label);

        primaryStage.setTitle("Java Button (o7planning.org)");

        Scene scene = new Scene(root, 350, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

}
Chạy ví dụ:

4. Áp dụng hiệu ứng cho Button

Button là một lớp mở rộng từ lớp Node, do vậy bạn cũng có thể áp dụng các hiệu ứng cho Button. Chẳng hạn hiệu ứng bóng đổ (Drop Shadow),.. Có nhiều lớp liên quan tới hiệu ứng bạn có thể tìm thấy trong package javafx.scene.effect.
Ví dụ dưới đây minh họa hiệu ứng bóng đổ (Drop Shadow) và hiệu ứng chuyển động mờ (Motion Blur) cho Button khi chuột di chuyển vào bề mặt Button.
ButtonEffectDemo.java
package org.o7planning.javafx.button;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.MotionBlur;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class ButtonEffectDemo extends Application {

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

       FlowPane root = new FlowPane();
       root.setPadding(new Insets(10));
       root.setHgap(10);
       root.setVgap(10);

       // --- Button 1 ------------
       Button button1 = new Button("Drop Shadow effect");

       DropShadow shadow = new DropShadow();

 
       // Thêm bóng đổ vào Button khi chuột di chuyển bên trên
       button1.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
           @Override
           public void handle(MouseEvent e) {
               button1.setEffect(shadow);
           }
       });
 
       // Loại bỏ bóng đổ khi chuột thoát ra khỏi Button.
       button1.addEventHandler(MouseEvent.MOUSE_EXITED, new EventHandler<MouseEvent>() {
           @Override
           public void handle(MouseEvent e) {
               button1.setEffect(null);
           }
       });

       // --- Button 2 ------------
       Button button2 = new Button("Motion Blur effect");

       MotionBlur motionBlur = new MotionBlur();

 
       // Thêm hiệu ứng chuyển động mờ (Motion Blur)
       // vào Button khi chuột di chuyển bên trên
       button2.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
           @Override
           public void handle(MouseEvent e) {
               button2.setEffect(motionBlur);
           }
       });

 
       // Loại bỏ hiệu ứng chuyển động mờ (Motion Blur)
       // khi chuột thoát ra khỏi Button.
       button2.addEventHandler(MouseEvent.MOUSE_EXITED, new EventHandler<MouseEvent>() {
           @Override
           public void handle(MouseEvent e) {
               button2.setEffect(null);
           }
       });

       root.getChildren().addAll(  button1, button2);

       primaryStage.setTitle("Java Button (o7planning.org)");

       Scene scene = new Scene(root, 350, 150);
       primaryStage.setScene(scene);
       primaryStage.show();

   }

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

}

5. Kiểu dáng Button (Css Style)

Bạn có thể sử dụng CSS trong JavaFX và áp dụng nó cho Button, CSS trong JavaFX rất giống với CSS trong HTML. Bạn có thể định nghĩa các style trong các file css, và khai báo nó với ứng dụng. Và có thể áp dụng các lớp style bạn đã định nghĩa ra bằng cách sử dụng phương thức setStyleClass.
Ngoài ra, bạn có thể xác định style cho một Button trực tiếp trên mã Java bằng cách sử dụng các phương thức setStyle.
button1.setStyle("-fx-font: 22 arial; -fx-base: #b6e7c9;");
Bạn có thể xem thêm tài liệu về JavaFX Css tại:
  • JavaFX CSS Style
Xem ví dụ đầy đủ:
ButtonCssDemo.java
package org.o7planning.javafx.button;

import java.io.InputStream;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class ButtonCssDemo extends Application {

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

        FlowPane root = new FlowPane();
        root.setPadding(new Insets(10));
        root.setHgap(10);
        root.setVgap(10);

   

        InputStream input = //
                getClass().getResourceAsStream("/org/o7planning/javafx/icon/java-32.png");

        Image image = new Image(input);
        ImageView imageView = new ImageView(image);

        // Button 1
        Button button1 = new Button("JavaFX", imageView);
       
        // Set Style
        button1.setStyle("-fx-font: 22 arial; -fx-base: #b6e7c9;");

        root.getChildren().add (button1 );

        primaryStage.setTitle("Java Button (o7planning.org)");

        Scene scene = new Scene(root, 350, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

}

Các hướng dẫn lập trình JavaFX

Show More