作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这个问题已被问过多次,但我无法从任何文章中获得帮助。
我的 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/
我是一名优秀的程序员,十分优秀!