当前位置: 首页 > 知识库问答 >
问题:

在现有行之间将项目拖放到TableView中

程吕恭
2023-03-14

表包含以下行(例如,一列):

A
B
C

我正在尝试弄清楚如何将项目拖入其中,并将其放置在现有的B行和C行之间。

我能够进行拖放操作,从而在表的末尾添加一个项目,但我无法根据我释放鼠标按钮的位置将其放置在行之间。

共有1个答案

闻法
2023-03-14

创建一个< code>rowFactory生成< code>TableRow的,它接受手势并根据鼠标位置决定是在行之前还是之后添加项目:

@Override
public void start(Stage primaryStage) {
    TableView<Item> table = new TableView<>();

    Button button = new Button("A");

    // d&d source providing next char
    button.setOnDragDetected(evt -> {
        Dragboard db = button.startDragAndDrop(TransferMode.MOVE);
        ClipboardContent content = new ClipboardContent();
        content.putString(button.getText());
        db.setContent(content);
    });
    button.setOnDragDone(evt -> {
        if (evt.isAccepted()) {
            // next char
            button.setText(Character.toString((char) (button.getText().charAt(0) + 1)));
        }
    });

    // accept for empty table too
    table.setOnDragOver(evt -> {
        if (evt.getDragboard().hasString()) {
            evt.acceptTransferModes(TransferMode.COPY_OR_MOVE);
        }
        evt.consume();
    });
    table.setOnDragDropped(evt -> {
        Dragboard db = evt.getDragboard();
        if (db.hasString()) {
            table.getItems().add(new Item(db.getString()));
            evt.setDropCompleted(true);
        }
        evt.consume();
    });

    TableColumn<Item, String> col = new TableColumn<>("value");
    col.setCellValueFactory(new PropertyValueFactory<>("value"));
    table.getColumns().add(col);

    // let rows accept drop too
    table.setRowFactory(tv -> {
        TableRow<Item> row = new TableRow();
        row.setOnDragOver(evt -> {
            if (evt.getDragboard().hasString()) {
                evt.acceptTransferModes(TransferMode.COPY_OR_MOVE);
            }
            evt.consume();
        });
        row.setOnDragDropped(evt -> {
            Dragboard db = evt.getDragboard();
            if (db.hasString()) {
                Item item = new Item(db.getString());
                if (row.isEmpty()) {
                    // row is empty (at the end -> append item)
                    table.getItems().add(item);
                } else {
                    // decide based on drop position whether to add the element before or after
                    int offset = evt.getY() > row.getHeight() / 2 ? 1 : 0;
                    table.getItems().add(row.getIndex() + offset, item);
                    evt.setDropCompleted(true);
                }
            }
            evt.consume();
        });
        return row;
    });

    Scene scene = new Scene(new VBox(button, table));

    primaryStage.setScene(scene);
    primaryStage.show();
}
public class Item {

    public Item() {
    }

    public Item(String value) {
        this.value.set(value);
    }

    private final StringProperty value = new SimpleStringProperty();

    public String getValue() {
        return value.get();
    }

    public void setValue(String val) {
        value.set(val);
    }

    public StringProperty valueProperty() {
        return value;
    }

}
 类似资料:
  • 我用JavaFX2.1创建了我的应用程序,最近用JavaFX8升级到JDK 8。 当我更改ComboBox的值时,TableView会中断,但如果我在表中选择某些内容,则可以。 Netbeans显示: javafx。场景CssStyleHelper calculateValue警告:在解析规则“*”中的“-fx文本填充”查找时,无法解析“-fx文本背景色”。在样式表jar:file:/C:/Pro

  • 我的目标是通过拖放对tableview进行排序。我举了一个例子:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm 对于拖放,我通过Scene Builder添加了fxml 制造了控制器 但是在drag Drop,我无法得到我扔下物体的那排位置。我得到的只是手机信息<代码>文本[Text=“

  • 这个想法很简单,几乎可行。有两个表,用户可以选择在两个表之间拖动行。当一行从table1拖到table2时,使用ajax来更新数据库,使用从table1中删除并添加到table2的数据,并用新数据重新显示两个表。如果信息从表2拖到表1,情况也是如此。 您可以在这里看到一个代码示例。 以下是其中一个表的Javascript代码摘录: 除了一种情况外,它工作得很好。如果将一行从表1拖到表2,它将创建一

  • 我正在学习本教程中的示例。根据教程,我想在两个选项卡之间拖动选项卡。到目前为止,我设法创建了这段代码,但我需要一些帮助才能完成代码。 来源 将选项卡的内容作为对象插入的正确方法是什么?简单的文本被转移到教程中。我必须如何修改这行< code>content.put(DataFormat。PLAIN_TEXT,tab pane);? 拖动选项卡后插入选项卡的正确方法是什么: 目的地 我想这个转移可以

  • 我更新到1.4 RC 1,想添加adMob到现有的项目现在Android Studio没有编译项目。我试图返回一切,但没有关系不运行项目。总是给主题错误。我删除了所有写的代码从清单,主要活动,main_activity布局,字符串,build.gradle属于adMob。现在。我读了很多线程,但没有写it.please我不能自己解决,需要帮助。谢谢。 [代码]信息:Gradle任务[: app:

  • 我有两个JTable,它们被设置为可以拖放每个JTable中的行。问题是它允许我将一行从一个JTable拖到另一个JTable,我正试图找出如何阻止它。我只希望用户能够在同一个JTable中拖放一行。 换句话说,当我在当前表外拖动一行并将鼠标悬停在空白面板空间上时,鼠标光标会显示一个带对角线的圆,这就是我想要的。然而,当我将鼠标拖动到另一个表上时,它会显示一个小的矩形“拖放”图标,这就是我试图阻止