寻求支持半星、十分之八星评分可视化的JavaFX库
JavaFX 支持精确星级评分可视化的方案
自定义实现(最灵活可控)
不需要依赖第三方库,自己写个简单的自定义控件就能实现任意精度的星级显示,核心思路是用两层星星:底层放灰色空星,上层叠加彩色实星,通过控制上层实星的显示区域(viewport)来实现部分星的效果。
示例代码:
import javafx.geometry.Pos; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.shape.Rectangle2D; public class PreciseRating extends HBox { private static final int MAX_STARS = 5; private static final double STAR_SIZE = 20.0; public PreciseRating() { // 添加底层空星 for (int i = 0; i < MAX_STARS; i++) { ImageView emptyStar = new ImageView(new Image("empty_star.png")); emptyStar.setFitWidth(STAR_SIZE); emptyStar.setFitHeight(STAR_SIZE); getChildren().add(emptyStar); } // 添加上层实星容器 HBox filledContainer = new HBox(); filledContainer.setMouseTransparent(true); for (int i = 0; i < MAX_STARS; i++) { ImageView filledStar = new ImageView(new Image("filled_star.png")); filledStar.setFitWidth(STAR_SIZE); filledStar.setFitHeight(STAR_SIZE); filledContainer.getChildren().add(filledStar); } getChildren().add(filledContainer); setAlignment(Pos.CENTER_LEFT); } public void setRating(double rating) { double clampedRating = Math.max(0, Math.min(MAX_STARS, rating)); HBox filledContainer = (HBox) getChildren().get(1); int fullStars = (int) Math.floor(clampedRating); double partialWidth = (clampedRating - fullStars) * STAR_SIZE; for (int i = 0; i < MAX_STARS; i++) { ImageView star = (ImageView) filledContainer.getChildren().get(i); if (i < fullStars) { star.setViewport(null); star.setVisible(true); } else if (i == fullStars && partialWidth > 0) { star.setViewport(new Rectangle2D(0, 0, partialWidth, STAR_SIZE)); star.setVisible(true); } else { star.setVisible(false); } } } }
这种方式可以支持到0.1星的精度,只要替换对应的空星、实星图片即可。
第三方库选项
如果不想自己写,这些成熟的JavaFX控件库支持精确星级显示:
- ControlsFX:它的
Rating控件支持小数评分,只需开启partialRating属性为true,然后设置rating为3.8这类小数就能自动渲染部分星。 - JFoenix:它的星级控件原生支持部分星展示,直接设置评分值为小数即可实现对应比例的星级填充。
内容的提问来源于stack exchange,提问作者jonas-pammi
相关产品推荐
相关产品推荐

