gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:20:07 25 4
gpt4 key购买 nike

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

我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com