java - 我是 JavaFX 新手。我需要有关如何使 TreeView 节点可拖动和可放置的帮助

标签 java treeview

我知道这个问题已被问过多次,但我无法从任何文章中获得帮助。

我的 Main.FXML 是

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <children>
        <TreeView fx:id="treeView" layoutX="51.0" layoutY="24.0" onContextMenuRequested="#mouseClick" onMouseClicked="#mouseClick" prefHeight="352.0" prefWidth="493.0" />
    </children>
</AnchorPane>

我的Controller.java是

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.MouseEvent;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable
{
    @FXML TreeView<String> treeView;

    @Override
    public void initialize(URL location, ResourceBundle resources)
    {
        TreeItem<String> root = new TreeItem<>("root");

        TreeItem<String> nodeA = new TreeItem<>("nodeA");
        TreeItem<String> nodeB = new TreeItem<>("nodeB");
        TreeItem<String> nodeC = new TreeItem<>("nodeC");

        root.getChildren().add(nodeA);
        root.getChildren().add(nodeB);
        root.getChildren().add(nodeC);

        treeView.setRoot(root);

        root.setExpanded(true);
    }

    @FXML
    private void mouseClick(MouseEvent mouseEvent)
    {
        TreeItem<String> item = treeView.getSelectionModel().getSelectedItem();
        System.out.println(item.getValue());
    }
}

我的 Main.java 是

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


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

我看过一篇文章,教如何通过添加 Cell 属性通过 TreeCell 将拖放功能添加到 TreeItem。但这些过程非常复杂,我作为 JavaFX 的外行无法理解这些。

所以,如果有人能帮助我解决这个问题,那将会非常有帮助。

提前致谢。

最佳答案

添加负责设置自定义单元工厂的 Controller 代码,该代码会将处理程序附加到 Drag/MouseEvents。

treeView.setCellFactory(param -> {
    // creating cell from deafult factory
    TreeCell<String> treeCell = TextFieldTreeCell.forTreeView().call(param);
    // setting handlers
    treeCell.setOnDragDetected(this::onDragDetected);
    treeCell.setOnDragOver(this::onDragOver);
    treeCell.setOnDragDropped(this::onDragDropped);
    return treeCell;
});

基本处理程序取自 DragEvent javadoc 页面:

private void onDragDetected(MouseEvent event) {
    TreeCell<String> source = (TreeCell<String>) event.getSource();
    Dragboard db = source.startDragAndDrop(TransferMode.ANY);
    ClipboardContent content = new ClipboardContent();
    content.putString(source.getItem());
    db.setContent(content);
    event.consume();
}

private void onDragOver(DragEvent dragEvent) {
    Dragboard db = dragEvent.getDragboard();
    if (db.hasString()) {
        dragEvent.acceptTransferModes(TransferMode.COPY);
    }
    dragEvent.consume();
}

private void onDragDropped(DragEvent event) {
    Dragboard db = event.getDragboard();
    boolean success = false;
    if (db.hasString()) {
        System.out.println("Dropped: " + db.getString());
        success = true;
    }
    event.setDropCompleted(success);
    event.consume();
}

关于java - 我是 JavaFX 新手。我需要有关如何使 TreeView 节点可拖动和可放置的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40216436/

相关文章:

java - 为什么我的 onResume 被调用了两次?

Java错误: Could not find or load main class undefined

c++ - TreeView_SetExtendedStyle 不应用某些样式,我做错了什么?

asp.net-mvc - Asp.Net MVC Core Telerik TreeView 文本显示为未定义

delphi - 如何获取特定树节点的根索引?

c# - WPF - 使用嵌套的 HierarchicalDataTemplate 在 TreeView 中刷新 CollectionView 而不会丢失选择

java - JUnit:针对一种方法创建多个测试方法?

java - ReplaceSelector 和包含文件之间的区别

java - 解析 java main args[] 数组错误

WPF:Treeview 项根使用与子节点不同的模板