拖放事件完成后,如何在javafx tablecell中设置单元格值?
我正在设计一个允许拖放拖放事件完成后,如何在javafx tablecell中设置单元格值?,java,javafx,drag-and-drop,tableview,Java,Javafx,Drag And Drop,Tableview,我正在设计一个允许拖放TableView单元格的应用程序 但是,一旦拖放完成并且单元格的值成功切换,双击已进行拖放的单元格将使单元格在拖放之前更改回其原始文本 帮我解决这个问题。以下代码用于为所有单元格设置cellFactoryValue。我是javafx新手 private void setCellFactoryForColumns(TableColumn<TimeTable, String> col) { col.setCellFactory((TableColumn&l
TableView
单元格的应用程序
但是,一旦拖放完成并且单元格的值成功切换,双击已进行拖放的单元格将使单元格在拖放之前更改回其原始文本
帮我解决这个问题。以下代码用于为所有单元格设置cellFactoryValue
。我是javafx新手
private void setCellFactoryForColumns(TableColumn<TimeTable, String> col)
{
col.setCellFactory((TableColumn<TimeTable, String> e) -> {
TableCell<TimeTable, String> cell = new TableCell<TimeTable, String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
} else {
setText(item);
setGraphic(null);
}
}
};
col.setOnEditCommit((CellEditEvent<TimeTable, String> t) -> {
((TimeTable)t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setDay(t.getNewValue());
});
cell.setOnDragDetected((MouseEvent event) -> {
Dragboard db = cell.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString(cell.getText());
db.setContent(content);
cell.setStyle("-fx-background-color: red;"
+ "-fx-text-fill: white;");
cell.startEdit();
cell.setText("Dragged");
event.consume();
});
cell.setOnDragOver((DragEvent event) ->{
if(event.getGestureSource() != cell &&
event.getDragboard().hasString())
{
event.acceptTransferModes(TransferMode.MOVE);
cell.setStyle("-fx-background-color: green;"
+ "-fx-text-fill: white;");
}
event.consume();
});
cell.setOnDragEntered((DragEvent event) ->{
if(event.getGestureSource() != cell &&
event.getDragboard().hasString()){
cell.setStyle("-fx-background-color: yellow;");
}
event.consume();
});
cell.setOnDragExited((DragEvent event) -> {
cell.setStyle("-fx-background-color: grey;");
event.consume();
});
cell.setOnDragDropped((DragEvent event) -> {
Dragboard db = event.getDragboard();
boolean success = false;
if(db.hasString())
{
holdData = cell.getText();
cell.setText(db.getString());
success = true;
}
event.setDropCompleted(success);
event.consume();
});
cell.setOnDragDone((DragEvent event) ->{
if(event.getTransferMode() == TransferMode.MOVE)
{
cell.setText(holdData);
}
event.consume();
});
return cell;
});
}
private void setCellFactoryForColumns(TableColumn列)
{
列setCellFactory((表e列)->{
TableCell单元格=新的TableCell(){
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(空);
设置图形(空);
}否则{
setText(项目);
设置图形(空);
}
}
};
col.setOnEditCommit((CellEditEvent t)->{
((时间表)t.getTableView().getItems().get(
t、 getTablePosition().getRow())
).setDay(t.getNewValue());
});
cell.setOnDragDetected((MouseeEvent事件)->{
Dragboard db=cell.startDragAndDrop(TransferMode.ANY);
ClipboardContent=新的ClipboardContent();
content.putString(cell.getText());
db.setContent(content);
cell.setStyle(“-fx背景色:红色;”
+“-fx文本填充:白色;”;
cell.startEdit();
cell.setText(“拖动”);
event.consume();
});
cell.setOnDragOver((DragEvent事件)->{
if(event.getGestureSource()!=单元格&&
event.getDragboard().haString())
{
event.acceptTransferModes(TransferMode.MOVE);
cell.setStyle(“-fx背景色:绿色;”
+“-fx文本填充:白色;”;
}
event.consume();
});
cell.setOnDragEntered((DrageEvent事件)->{
if(event.getGestureSource()!=单元格&&
event.getDragboard().haString()){
cell.setStyle(“-fx背景色:黄色;”);
}
event.consume();
});
cell.setOnDragExited((DrageEvent事件)->{
cell.setStyle(“-fx背景色:灰色;”);
event.consume();
});
cell.setOnDragDropped((DrageEvent事件)->{
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hastring())
{
holdData=cell.getText();
cell.setText(db.getString());
成功=真实;
}
事件。setDropCompleted(成功);
event.consume();
});
cell.setOnDragDone((DrageEvent事件)->{
if(event.getTransferMode()==TransferMode.MOVE)
{
cell.setText(holdData);
}
event.consume();
});
返回单元;
});
}
您只需更改单元格中的文本,而不是项的属性。因此,每次将新项目分配给表格单元格
,都会将旧值用作文本
如果将包含项目的单元格从视图中滚动,也会发生这种情况
要修复此问题,请更换
cell.setText(db.getString());
及
onDragDone
/ondragdroped
处理程序中的语句
update(cell, db.getString());
及
分别执行update
方法,如下所示:
static void update(TableCell<TimeTable, String> cell, String newValue) {
((TableRow<TimeTable>)cell.getTableRow()).getItem().setDay(newValue);
// the below line would be needed, if the setter does not trigger
// a update of the ObservableValue returned by the cellValueFactory
// cell.getTableView().refresh();
}
如何实现更新方法?我是javafx新手,不知道如何才能做到这一点。我已经发布了两个版本的
update
方法。。。如果没有关于时间表
类和列的cellValueFactory
的更多信息,我无法告诉您可以使用哪一个。
update(cell, holdData);
static void update(TableCell<TimeTable, String> cell, String newValue) {
((TableRow<TimeTable>)cell.getTableRow()).getItem().setDay(newValue);
// the below line would be needed, if the setter does not trigger
// a update of the ObservableValue returned by the cellValueFactory
// cell.getTableView().refresh();
}
static <I,P>void update(TableCell<I, P> cell, P newValue) {
WritableValue<P> property = (WritableValue<P>) cell.getTableColumn().getCellObservableValue(((TableRow<I>)cell.getTableRow()).getItem());
property.setValue(newValue);
}