我有一个CheckBoxListItem
和一个名为CellFactory
的自定义CheckBox项。一切看起来都很不错,但现在我需要实现拖放操作,以便于排序。
我知道我必须使用自定义CellFactory
并将拖放事件设置为单元格本身。我的问题是我已经有一个updateItem
并且不知道如何添加事件。
我认为注释的代码可能是这样做的方法,但是public class Main extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
ListView<CheckBoxListItem> listView = new ListView<>();
ScrollPane scrollPane = new ScrollPane(listView);
scrollPane.setFitToHeight(true);
scrollPane.setFitToWidth(true);
for(int i=1; i<15; i++) {
listView.getItems().add(new CheckBoxListItem("Value"+i));
}
listView.setCellFactory(CheckBoxListCell.forListView(CheckBoxListItem::selectedProperty, new StringConverter< CheckBoxListItem>() {
@Override
public String toString(CheckBoxListItem object) {
return object.getName();
}
@Override
public CheckBoxListItem fromString(String string) {
return null;
}
}));
/*
ObjectProperty<CheckBoxListCell<CheckBoxListItem>> dragSource = new SimpleObjectProperty<>();
listView.setCellFactory(lv -> {
CheckBoxListCell<CheckBoxListItem> cell = new CheckBoxListCell<CheckBoxListItem>(){
@Override
public void updateItem(CheckBoxListItem item , boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setGraphic(null);
}else {
setGraphic(?????);
}
}
};
cell.setOnDragDetected(event -> {
//TODO
});
cell.setOnDragOver(event -> {
//TODO
});
cell.setOnDragDropped(event -> {
//TODO
});
return cell ;
});
*/
Scene scene = new Scene(scrollPane, 350, 450);
stage.setScene(scene);
stage.show();
}
@Override
public void stop() {
System.exit(0);
}
}
方法不起作用。
我的主班:
public class CheckBoxListItem {
private ReadOnlyStringWrapper name = new ReadOnlyStringWrapper();
private BooleanProperty selected = new SimpleBooleanProperty(false);
public CheckBoxListItem(String name) {
this.name.set(name);
}
public CheckBoxListItem(String name, boolean selected) {
this.name.set(name);
this.selected.set(selected);
}
public String getName() {
return name.get();
}
public BooleanProperty selectedProperty() {
return selected;
}
public boolean isSelected() {
return selected.get();
}
public void setSelected(boolean selected) {
this.selected.set(selected);
}
}
和CheckBoxListItem.java:
LPAD(your_col::text, 4, '0')
答案 0 :(得分:1)
解决方案是您必须结合两种方法的解决方案。您只能模仿CheckBoxListCell.forListView()内部执行的操作。也就是说,使用observableProperty和转换器创建一个新的CheckBoxListCell。我只是将您的演示重新修改为下面的示例,它可以正常工作。
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
ListView<CheckBoxListItem> listView = new ListView<>();
ScrollPane scrollPane = new ScrollPane(listView);
scrollPane.setFitToHeight(true);
scrollPane.setFitToWidth(true);
for (int i = 1; i < 15; i++) {
listView.getItems().add(new CheckBoxListItem("Value" + i));
}
// listView.setCellFactory(CheckBoxListCell.forListView(CheckBoxListItem::selectedProperty, new StringConverter< CheckBoxListItem>() {
// @Override
// public String toString(CheckBoxListItem object) {
// return object.getName();
// }
//
// @Override
// public CheckBoxListItem fromString(String string) {
// return null;
// }
// }));
ObjectProperty<CheckBoxListCell<CheckBoxListItem>> dragSource = new SimpleObjectProperty<>();
listView.setCellFactory(lv -> {
CheckBoxListCell<CheckBoxListItem> cell = new CheckBoxListCell<>(CheckBoxListItem::selectedProperty, new StringConverter<CheckBoxListItem>() {
@Override
public String toString(CheckBoxListItem object) {
return object.getName();
}
@Override
public CheckBoxListItem fromString(String string) {
return null;
}
});
cell.setOnDragDetected(event -> {
System.out.println("Detected fired...");
});
cell.setOnDragOver(event -> {
System.out.println("DragOver fired...");
});
cell.setOnDragDropped(event -> {
System.out.println("DragDropped fired...");
});
return cell;
});
Scene scene = new Scene(scrollPane, 350, 450);
stage.setScene(scene);
stage.show();
}
@Override
public void stop() {
System.exit(0);
}
}