Hướng dẫn sử dụng JavaFX MenuButton và SplitMenuButton
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- JavaFX MenuButton & SplitMenuButton

MenuButton là một nút mà khi nhấn vào, nó không thực hiện bất kỳ hành động khác hơn so với hiện/ẩn một menu chứa các menuItem. Vì lý do này, không giống như JavaFX Button bình thường, không có thuộc tính hành động mà bạn có thể định nghĩa.

MenuButton

Khi người dùng click vào MenuButton, một menu sẽ hiển thị ra, các Item trong đó có thể là kiểu MenuItem, CheckMenuItem, RadioMenuItem hoặc SeparatorMenuItem. Và bạn có thể sử lý các sự kiện khi người dùng click vào các item, về cơ bản MenuButton không khác biệt gì với một Menu thông thường.

SplitMenuButton

MenuButton so với SplitMenuButton.

SplitMenuButton rất giống với một MenuButton, và nó cũng giống với một Button, nó cho phép bạn gắn một hành động khi người dùng click vào bên trái. Hãy chú ý SplitMenuButton phân chia làm 2 phần bên trái và bên phải. Khi người dùng click vào bên trái nó hành động giống một Button, khi người dùng click vào bên phải nó hành động giống một MenuButton.

2- Ví dụ với JavaFX MenuButton

MenuButtonDem.java
package org.o7planning.javafx.menubutton;

import java.io.InputStream;

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

public class MenuButtonDemo extends Application {

  // resourcePath: "/org/o7planning/javafx/icon/flag-vi.png"
  private ImageView getIcon(String resourcePath) {
      InputStream input //
              = this.getClass().getResourceAsStream(resourcePath);
      Image image = new Image(input);
      return new ImageView(image);
  }

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

      ImageView imageViewVI = this.getIcon("/org/o7planning/javafx/icon/flag-vi.png");
      ImageView imageViewEN = this.getIcon("/org/o7planning/javafx/icon/flag-en.png");
      ImageView imageViewIN = this.getIcon("/org/o7planning/javafx/icon/flag-in.png");


      // Tạo các MenuItem.
      MenuItem menuItemVI = new MenuItem("Vietnamese", imageViewVI);
      MenuItem menuItemEN = new MenuItem("English", imageViewEN);
      MenuItem menuItemIN = new MenuItem("India", imageViewIN);

      ImageView imageViewLang = this.getIcon("/org/o7planning/javafx/icon/language.png");

      // Tạo MenuButton với text, Icon và 3 Items
      MenuButton menuButton = new MenuButton("Languages", imageViewLang, //
              menuItemVI, menuItemEN, menuItemIN);

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

      root.getChildren().addAll(menuButton);

      Scene scene = new Scene(root, 320, 150);

      primaryStage.setTitle("JavaFX MenuButton (o7planning.org)");
      primaryStage.setScene(scene);
      primaryStage.show();
  }

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

}

3- Ví dụ với JavaFX SplitMenuButton

SplitMenuButtonDemo.java
package org.o7planning.javafx.menubutton;

import java.io.InputStream;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SplitMenuButton;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class SplitMenuButtonDemo extends Application {

   private int count = 1;

   // resourcePath: "/org/o7planning/javafx/icon/flag-vi.png"
   private ImageView getIcon(String resourcePath) {
       InputStream input //
               = this.getClass().getResourceAsStream(resourcePath);
       Image image = new Image(input);
       return new ImageView(image);
   }

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

       Label label = new Label();

       ImageView imageViewVI = this.getIcon("/org/o7planning/javafx/icon/flag-vi.png");
       ImageView imageViewEN = this.getIcon("/org/o7planning/javafx/icon/flag-en.png");
       ImageView imageViewIN = this.getIcon("/org/o7planning/javafx/icon/flag-in.png");
 
       // Tạo các MenuItem.
       MenuItem menuItemVI = new MenuItem("Vietnamese", imageViewVI);
       MenuItem menuItemEN = new MenuItem("English", imageViewEN);
       MenuItem menuItemIN = new MenuItem("India", imageViewIN);

       ImageView imageViewLang = this.getIcon("/org/o7planning/javafx/icon/language.png");
 
       // Tạo MenuButton với 3 Items
       SplitMenuButton splitMenuButton = new SplitMenuButton(menuItemVI, menuItemEN, menuItemIN);

       splitMenuButton.setText("Language");
       splitMenuButton.setGraphic(imageViewLang);
 
       // Sử lý khi người dùng click vào phần bên trái của SplitMenuButton.
       splitMenuButton.setOnAction(new EventHandler<ActionEvent>() {

           @Override
           public void handle(ActionEvent event) {
               label.setText("Clicked " + count++);
           }
       });

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

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

       Scene scene = new Scene(root, 320, 150);

       primaryStage.setTitle("JavaFX SplitMenuButton (o7planning.org)");
       primaryStage.setScene(scene);
       primaryStage.show();
   }

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

}