带有gridpane的Javafx Treeview单元工厂

时间:2019-03-13 12:14:09

标签: java javafx treeview gridpane

我有一个TreeView<GridPane>,而GridPane包含多个节点,例如按钮和标签。 GridPane内部的节点数量有所不同。

我需要单元工厂来获取MouseEntered事件,但是当我使用下面的代码时,则不会显示任何内容。

我当前的代码如下:

treeView.setCellFactory(tv -> {
    TreeCell<GridPane> cell = new TreeCell<GridPane>() {
        @Override
        protected void updateItem(GridPane item, boolean empty) {
            super.updateItem(item, empty);
        }
    };

    cell.setOnMouseEntered(e -> {
        //TODO
    });

    return cell ;
});

我知道updateItem方法需要修改,但是我不知道如何修改,因为GridPane内部的节点数会有所不同。

编辑 这是课程。

TreeController.java:

public class TreeController {

    private TreeItem<GridPane> rootItem;
    private int hgap = 5;

    @FXML private TreeView<GridPane> treeView;

    @FXML
    private void initialize() {

        GridPane gp = new GridPane();
        gp.add(new Label("Label1"), 0, 0);
        gp.getColumnConstraints().add(0, new ColumnConstraints());
        gp.getColumnConstraints().get(0).setHgrow(Priority.NEVER);

        Button cond = new Button("button");
        gp.add(cond, 1, 0);
        gp.getColumnConstraints().add(1, new ColumnConstraints());
        gp.getColumnConstraints().get(1).setHgrow(Priority.NEVER);


        gp.add(new Label("Label2"), 2, 0);
        gp.getColumnConstraints().add(2, new ColumnConstraints());
        gp.getColumnConstraints().get(2).setHgrow(Priority.ALWAYS);

        Button btnAdd = new Button("Add");
        gp.add(btnAdd, 3, 0);
        gp.setHgap(hgap);

        rootItem = new TreeItem<GridPane>(gp);
        rootItem.setExpanded(true);

        treeView.setRoot(rootItem);

        rootItem.getChildren().add(new TreeItem<GridPane>(createGridRow("Age", false)));
        rootItem.getChildren().add(new TreeItem<GridPane>(createGridRow("Person", true)));

        /*
        treeView.setCellFactory(tv -> {
            TreeCell<GridPane> cell = new TreeCell<GridPane>() {
                @Override
                protected void updateItem(GridPane item, boolean empty) {
                    super.updateItem(item, empty);
                }
            };

            cell.setOnMouseEntered(e -> {
                System.out.println("changed cell");
            });

            return cell ;
        });
        */
    }

    private GridPane createGridRow(String selectedCol, Boolean showAddButton) {
        int index = 0;
        GridPane gp = new GridPane();

        Button columnName = new Button(selectedCol);
        gp.add(columnName, index, 0);
        gp.getColumnConstraints().add(index, new ColumnConstraints());
        gp.getColumnConstraints().get(index).setHgrow(Priority.NEVER);
        index++;

        Button condition = new Button("greater than");
        gp.add(condition, index, 0);
        gp.getColumnConstraints().add(index, new ColumnConstraints());
        gp.getColumnConstraints().get(index).setHgrow(Priority.NEVER);
        index++;


        Button value = new Button("[enter value]");
        gp.add(value, index, 0);
        gp.getColumnConstraints().add(index, new ColumnConstraints());
        gp.getColumnConstraints().get(index).setHgrow(Priority.ALWAYS);
        index++;

        if (showAddButton) {
            Button btnAdd = new Button("Add");
            gp.add(btnAdd, index, 0);
            gp.getColumnConstraints().add(index, new ColumnConstraints());
            gp.getColumnConstraints().get(index).setHgrow(Priority.NEVER);
            index++;
        }

        gp.setHgap(hgap);

        return gp;
    }

}

MainClass.java:

public class MainClass extends Application{

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

    @Override
    public void start(Stage stage) {
        Parent root;
        try {
            TreeController controller = new TreeController();

            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("TreeController.fxml"));
            fxmlLoader.setController(controller);
            root = fxmlLoader.load();

            Scene scene = new Scene(root, 600, 500);

            stage.setMinHeight(400);
            stage.setMinWidth(500);
            stage.setTitle("TreeController");
            stage.setScene(scene);
            stage.setResizable(true);
            stage.show();
        } catch (IOException e) {
            e.printStackTrace();
        };    
    }

    @Override
    public void stop() {
        System.exit(0);
    }

}

TreeController.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.TreeView?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"     prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.161" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <ScrollPane fitToHeight="true" fitToWidth="true" layoutX="155.0" layoutY="111.0" prefHeight="200.0" prefWidth="200.0"     AnchorPane.bottomAnchor="20.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="20.0">
         <content>
            <TreeView fx:id="treeView" prefHeight="200.0" prefWidth="200.0" />
         </content>
      </ScrollPane>
   </children>
</AnchorPane>

1 个答案:

答案 0 :(得分:2)

这是一个非常简单但全面的示例。经过分析,您应该能够实施您的解决方案。

  <Target Name="MyCliToolTarget" AfterTargets="Build">
    <Exec Command="dotnet cqsgen" />
  </Target>
相关问题