JavaFX:使芯片在 JFXChipView 中可编辑

JavaFX: Make Chips Editable in JFXChipView

我想问一下是否可以在JFXChipView中设置一个芯片后可编辑。

您可以创建自己的 JFXChip 并实施行为以启用编辑。首先,您需要有一个可编辑的标签。我在网上查了一下,发现这个 post: JavaFX custom control - editable label。然后,您可以扩展 JFXChip 以使用 EditableLabel:

import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXChip;
import com.jfoenix.controls.JFXChipView;
import com.jfoenix.svg.SVGGlyph;
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.scene.layout.HBox;

public class EditableChip<T> extends JFXChip<Property<T>> {
    protected final HBox root;

    public EditableChip(JFXChipView<Property<T>> view, Property<T> item) {
        super(view, item);
        JFXButton closeButton = new JFXButton(null, new SVGGlyph());
        closeButton.getStyleClass().add("close-button");
        closeButton.setOnAction(event -> {
            view.getChips().remove(item);
            event.consume();
        });

        // Create the label with an initial value from the item
        String initialValue = view.getConverter().toString(item);
        EditableLabel label = new EditableLabel(initialValue);
        label.setMaxWidth(100);

        // Bind the item to the text in the label
        item.bind(Bindings.createObjectBinding(() -> view.getConverter().fromString(label.getText()).getValue(), label.textProperty()));

        root = new HBox(label, closeButton);
        getChildren().setAll(root);
    }
}

注意:我正在使用 Property<T> 而不是使用所需的 class T 因为 JFXChipView 在您第一次添加时存储项目.在这种情况下,您将获得在调用 JFXChipView#getChips().

时第一次输入的值

示例应用程序:

import com.jfoenix.controls.JFXChipView;
import javafx.application.Application;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class EditableChipViewApp extends Application {
    @Override
    public void start(Stage primaryStage) {
        JFXChipView<Property<String>> chipView = new JFXChipView<>();
        chipView.setChipFactory(EditableChip::new);

        chipView.setConverter(new StringConverter<Property<String>>() {
            @Override
            public String toString(Property<String> object) {
                return object == null ? null : object.getValue();
            }

            @Override
            public Property<String> fromString(String string) {
                return new SimpleStringProperty(string);
            }
        });

        VBox container = new VBox(chipView);
        Scene scene = new Scene(container, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

结果:

这是获得筹码实际值的方法:

List<String> chipsValues = chipView.getChips().stream().map(Property::getValue).collect(Collectors.toList());