remove CheckBoxPicker

This commit is contained in:
Timi
2026-06-17 01:13:41 +08:00
parent 0a5bb393cb
commit 867c5f6602
2 changed files with 0 additions and 198 deletions

View File

@@ -1,147 +0,0 @@
package com.imyeyu.fx.ui.components;
import com.imyeyu.fx.ui.TimiFXUI;
import com.imyeyu.java.bean.CallbackArgReturn;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.TilePane;
import javafx.stage.Popup;
import lombok.Getter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 多选选择器,文本框弹出复选框组件进行多项选择
*
* @author 夜雨
* @since 2021-12-29 17:05
*/
public class CheckBoxPicker<T> extends TextField implements TimiFXUI {
/** 数据列表 */
@Getter
private final ObservableList<T> items;
private final CheckBoxListPopup<T> checkBoxListPopup;
/** 默认构造器 */
public CheckBoxPicker() {
items = FXCollections.observableList(new ArrayList<>());
checkBoxListPopup = new CheckBoxListPopup<>(items);
setEditable(false);
// ---------- 事件 ----------
setOnMouseClicked(e -> {
Bounds b = localToScreen(getLayoutBounds());
checkBoxListPopup.show(this, b.getMinX() - 5, b.getMaxY() - 6);
});
checkBoxListPopup.root.prefWidthProperty().bind(widthProperty());
}
/**
* 设置复选框工厂,工厂入参数据对象,返回复选框组件
*
* @param factory 复选框工厂
*/
public void setCheckBoxFactory(CallbackArgReturn<T, CheckBox> factory) {
checkBoxListPopup.checkBoxFactory = factory;
}
/**
* 获取已选项
*
* @return 已选项
*/
public ObservableList<T> getSelectedItems() {
return checkBoxListPopup.selectedItems;
}
/**
* 复选框列表弹窗
*
* @param <T> 数据类型
* @author 夜雨
* @since 2021-12-29 19:40
*/
private static class CheckBoxListPopup<T> extends Popup implements TimiFXUI {
private static final Insets PADDING = new Insets(6, 8, 6, 8);
private final TilePane root;
private final Map<T, CheckBox> cache; // 数据映射缓存
final ObservableList<T> selectedItems;
CallbackArgReturn<T, CheckBox> checkBoxFactory;
/**
* 默认构造
*
* @param items 数据列表
*/
public CheckBoxListPopup(ObservableList<T> items) {
cache = new HashMap<>();
selectedItems = FXCollections.observableList(new ArrayList<>());
root = new TilePane();
root.setHgap(8);
root.setEffect(Shadow.POPUP);
root.setBorder(Stroke.DEFAULT);
root.setPadding(PADDING);
root.setMinWidth(300);
root.setBackground(BG.DEFAULT);
root.setTileAlignment(Pos.CENTER_LEFT);
setAutoHide(true);
getContent().add(root);
// ---------- 事件 ----------
// 列表更新
items.addListener((ListChangeListener<T>) c -> {
if (c.next()) {
if (c.wasAdded()) {
// 添加
List<? extends T> list = c.getAddedSubList();
for (T t : list) {
CheckBox box;
if (checkBoxFactory != null) {
box = checkBoxFactory.handler(t);
} else {
box = new CheckBox(t.toString());
}
box.selectedProperty().addListener((obs, o, isSelected) -> {
if (isSelected) {
selectedItems.add(t);
} else {
selectedItems.remove(t);
}
});
cache.put(t, box);
root.getChildren().add(box);
}
return;
}
if (c.wasRemoved()) {
// 移除
List<? extends T> list = c.getRemoved();
for (T t : list) {
root.getChildren().remove(cache.get(t));
}
}
}
});
}
}
}

View File

@@ -1,51 +0,0 @@
package com.imyeyu.fx.ui.examples.view.pages.component;
import com.imyeyu.fx.ui.TimiFXUI;
import com.imyeyu.fx.ui.components.CheckBoxPicker;
import com.imyeyu.fx.ui.examples.component.AbstractDemoPane;
import com.imyeyu.fx.ui.examples.component.sidebar.SidebarItem;
import com.imyeyu.inject.annotation.Component;
import javafx.collections.ListChangeListener;
import javafx.geometry.Insets;
import javafx.scene.layout.FlowPane;
import java.util.List;
/**
* 多选框选择器
*
* @author 夜雨
* @since 2022-08-29 15:27
*/
@Component
public class CheckBoxPickerDemo extends AbstractDemoPane {
public CheckBoxPickerDemo() {
title.setText(SidebarItem.CHECK_BOX_PICKER.getText());
document.sync("https://doc.imyeyu.net/timi-fx/net/imyeyu/timifx/component/CheckBoxPicker.html");
source.sync("https://git.imyeyu.net/Timi/timi-fx/src/master/src/main/java/net/imyeyu/timifx/component/CheckBoxPicker.java");
// 选择器
CheckBoxPicker<String> picker = new CheckBoxPicker<>();
picker.setPrefWidth(390);
picker.getSelectedItems().addListener((ListChangeListener<String>) c -> {
List<String> items = picker.getSelectedItems();
picker.clear();
for (int i = 0; i < items.size(); i++) {
picker.appendText(items.get(i));
if (i < items.size() - 1) {
picker.appendText(", ");
}
}
});
setCenter(new FlowPane() {{
setPadding(new Insets(20));
getChildren().add(picker);
}});
for (int i = 0; i < 32; i++) {
picker.getItems().add(TimiFXUI.MULTILINGUAL.text("fx.example.check_box_picker.item"));
}
}
}