ControlsFX の Rating の使い方

SNS や口コミサイト等では、お店、レストラン、あるいは、商品などの評価を表すために星マークがしばしば使われます。

例えばアマゾンでも、それぞれの商品の評価が星印がついているのはご存知の通りです。

一般的に、レビューをした結果の評価点のことをレイティング (Rating) といいますが、ControlsFX にもレイティングを表すためのコントロールが含まれています。 その名もズバリ Rating コントロールです。

ここでは Rating コントロールの使い方を紹介します。

ここでは Eclipse と Scene Builder を利用します。

JavaFX プロジェクトを作成します。ここでは FXML を Main.fxml とし、 コントローラクラスを MainController.java として作成しています。

Scene Builder で Main.fxml を開き、VBox をコンテナとして、上から Rating コントロールと Label コントロールを並べます。

Main.fxml は次の通りです。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import org.controlsfx.control.Rating?>

<BorderPane
	xmlns:fx="http://javafx.com/fxml/1"
	xmlns="http://javafx.com/javafx/8.0.171"
	fx:controller="application.MainController">
	<center>
		<VBox
			prefHeight="200.0"
			prefWidth="300.0"
			BorderPane.alignment="CENTER">
			<children>
				<Rating fx:id="rating1">
					<VBox.margin>
						<Insets
							bottom="20.0"
							left="20.0"
							right="20.0"
							top="20.0" />
					</VBox.margin>
				</Rating>
				<Label
					fx:id="label1"
					text="Label">
					<VBox.margin>
						<Insets
							bottom="20.0"
							left="20.0"
							right="20.0"
							top="20.0" />
					</VBox.margin>
					<font>
						<Font size="32.0" />
					</font>
				</Label>
			</children>
		</VBox>
	</center>
</BorderPane>

コントローラクラス MainController.java は次の通り。

package application;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import org.controlsfx.control.Rating;

public class MainController {

	@FXML
	private Rating rating1;

	@FXML
	private Label label1;

	final int MAX_RATING = 5;
	final int MIN_RATING = 0;

	@FXML
	void initialize() {
		rating1.ratingProperty().addListener(new ChangeListener<Number>() {

			@Override
			public void changed(
				ObservableValue<? extends Number> observable,
				Number oldValue,
				Number newValue) {

				double d = (double) newValue;
				d = Math.min(MAX_RATING, d);
				d = Math.max(MIN_RATING, d);
				String s = String.format("%.1f", d);
				label1.setText(s);
			}
		});

		rating1.setMax(MAX_RATING);
		rating1.setUpdateOnHover(true);
		rating1.setPartialRating(true);
		rating1.setRating(3.5);

	}
}

ここで setUpdateOnHover メソッドに true を渡すことで、マウスカーソルがコントロール上を通過したときに (ホバーしたときに)、 自動的に値がアップデートされるようにしています。

また setPartialRating メソッドに true を渡すことで、レイティングの値として端数を有効にしています。デフォルトでは整数です。

尚、ホバーしたときに最大値や最低値を超えた値がセットされる場合があったので、上限下限をマニュアルでセットしなおしています。 端数を無効にすればそのような動きはみられないようですが、今度は 0 値を渡す方法がなさそうです。いずれにせよ、簡単に解決できることなので、あまり気にする必要もないかと思い深追いしてません。

これらを読み込み起動するプログラムは次の通り。

package application;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.fxml.FXMLLoader;


public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Main.fxml"));
			Scene scene = new Scene(root,400,400);
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

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

以上で、上に示したような動作になるはずです。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門