单击树的节点

时间:2017-08-30 22:26:45

标签: javafx treeview fxml

我在点击树视图的项目时尝试加载新的FXML。

嗯,有一部分MainApp,其中加载了FXML。 在这里,我实现了一个根视图,其中将加载其他视图。

当有人点击节点" voir mes客户端"我尝试加载 clientView.fxml 在树视图上。该视图将包含在函数 mainMenuView

menuView.fxml 加载的视图中

在类 TreeLoadingEventHandler 中,函数 handle 加载在控制器中实现的树视图,最后将树视图加载到函数 mainMenuView 中。

public class MainApp extends Application {

    private Stage primaryStage;
    private BorderPane rootView;
    private static AnchorPane menuView;

    public MainApp()
    {}

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage=primaryStage;
        this.primaryStage.setTitle("MaK@mpta");

        launchRootLayout();
        mainMenuView();
        }   

    public void launchRootLayout()
    {
        try {
            FXMLLoader loader=new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/rootView.fxml"));
            rootView = (BorderPane)loader.load();

            Scene scene = new Scene(rootView);
            //scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void mainMenuView()
    {
        try
        {
            FXMLLoader loader=new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/menuView.fxml"));
            menuView=(AnchorPane)loader.load();
            rootView.setCenter(menuView);
            MenuViewController controller = loader.getController();
            controller.setMainApp(this);
            //controller.loadItems();
            TreeLoadingEventHandler Tree=new TreeLoadingEventHandler(controller);
            Tree.handle(null);   

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public void showClient()
    {
        try
        {
            FXMLLoader loader=new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/clientView.fxml"));
            AnchorPane clientView=(AnchorPane)loader.load();
            AnchorPane.setLeftAnchor(clientView, 220.0);
            menuView.getChildren().add(clientView);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

     private class TreeLoadingEventHandler implements EventHandler<ActionEvent> {
            private MenuViewController controller;

            TreeLoadingEventHandler(MenuViewController controller) {
              this.controller = controller;
            }    
            @Override
            public void handle(ActionEvent t) {
              controller.loadItems();
            }
          }

}

这是实现控制器的java类  function setMainApp 检索控制器的引用,我可以从中调用 MainApp 的函数 showClient 。 我已经实现了一个单元工厂 setfactoryCell 来调用clientView.fxml的加载,当有人点击item&#34; voir mes clients&#34;。

public class MenuViewController {

    @FXML
    TreeView <String> treeview;

    // Reference to the main application.
    private MainApp mainApp;

   // public MenuViewController()

    @SuppressWarnings("unchecked")
    public void initialize(URL location, ResourceBundle resources)
    {
        loadItems();
    }

      @SuppressWarnings("unchecked")
    public void loadItems()
    {
          TreeItem<String>root=new TreeItem<>("Root");

          TreeItem<String> clients=new TreeItem<>("Clients");
          TreeItem<String> addClient=new TreeItem<>("Ajouter Client");
          TreeItem<String> seeClient=new TreeItem<>("Voir mes clients");

          TreeItem<String> articles=new TreeItem<>("Articles");
          TreeItem<String> devis=new TreeItem<>("Devis");

          root.getChildren().addAll(clients,articles,devis);
          clients.getChildren().addAll(addClient,seeClient);

          root.setExpanded(true);
          treeview.setRoot(root);
          treeview.setShowRoot(false);  
          setfactoryCell();
    }

    private void  setfactoryCell()
    {
        treeview.setCellFactory(tree -> {
            TreeCell<String> cell = new TreeCell<String>() {
             @Override
                public void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty) ;
                    if (empty) {
                        setText(null);
                    } else {
                        setText(item);
                    }
                }
            };
            cell.setOnMouseClicked(event -> {
                if (! cell.isEmpty()) {
                    TreeItem<String> treeItem = cell.getTreeItem();
                    // do whatever you need with the treeItem...
                    if (treeItem.getValue().equals("Voir mes clients"))
                    {
                        selectViewClient();
                    }
                }
            });
            return cell ;
        });
    }
      /**
     * Is called by the main application to give a reference back to itself.
     * 
     * @param mainApp
     */

      public void selectViewClient()
      {
          mainApp.showClient();
      }

      public void setMainApp(MainApp mainApp) {
      this.mainApp = mainApp;
      }
}

这件事不起作用。 即使以前工作过的树视图也不再适用。 我可以帮忙吗? 当我点击项目&#34; voir mes客户&#34; ?
很抱歉发布了这么多代码,但我不知道如何缩短代码。

谢谢

0 个答案:

没有答案