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());
我想问一下是否可以在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());