2014-02-22 6 views
2

JavaFX의 컨텍스트 메뉴를 만들고 싶습니다. 이것은 내가 테스트 한 코드입니다. 그러나 어떤 이유로 트리 노드를 마우스 오른쪽 버튼으로 클릭 할 때 컨텍스트 메뉴가 없습니다. 내 실수를 찾아 내도록 도와 주시겠습니까?JavaFX 트리의 컨텍스트 메뉴

import java.util.Arrays; 
import java.util.List; 
import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.ContextMenuBuilder; 
import javafx.scene.control.MenuItemBuilder; 
import javafx.scene.control.TreeCell; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeView; 
import javafx.scene.control.cell.TextFieldTreeCell; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class MainApp extends Application 
{ 
    List<Employee> employees = Arrays.<Employee>asList(
     new Employee("New Chassi", "New Datacenter"), 
     new Employee("New Battery", "New Rack"), 
     new Employee("New Chassi", "New Server"), 
     new Employee("Anna Black", "Sales Department"), 
     new Employee("Rodger York", "Sales Department"), 
     new Employee("Susan Collins", "Sales Department"), 
     new Employee("Mike Graham", "IT Support"), 
     new Employee("Judy Mayer", "IT Support"), 
     new Employee("Gregory Smith", "IT Support"), 
     new Employee("Jacob Smith", "Accounts Department"), 
     new Employee("Isabella Johnson", "Accounts Department")); 
    TreeItem<String> rootNode = new TreeItem<>("MyCompany Human Resources"); 

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

    TreeView<String> treeView = new TreeView<>(rootNode); 

    @Override 
    public void start(Stage stage) 
    { 

     rootNode.setExpanded(true); 
     for (Employee employee : employees) 
     { 
      TreeItem<String> empLeaf = new TreeItem<>(employee.getName()); 
      boolean found = false; 
      for (TreeItem<String> depNode : rootNode.getChildren()) 
      { 
       if (depNode.getValue().contentEquals(employee.getDepartment())) 
       { 
        depNode.getChildren().add(empLeaf); 
        found = true; 
        break; 
       } 
      } 
      if (!found) 
      { 
       TreeItem<String> depNode = new TreeItem<>(
        employee.getDepartment()//,new ImageView(depIcon) // Set picture 
       ); 
       rootNode.getChildren().add(depNode); 
       depNode.getChildren().add(empLeaf); 
      } 
     } 

     stage.setTitle("Tree View Sample"); 
     VBox box = new VBox(); 
     final Scene scene = new Scene(box, 400, 300); 
     scene.setFill(Color.LIGHTGRAY); 

     treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() 
     { 

      @Override 
      public TreeCell<String> call(TreeView<String> arg0) 
      { 
       // custom tree cell that defines a context menu for the root tree item 
       return new MyTreeCell(); 
      } 
     }); 

     box.getChildren().add(treeView); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static class Employee 
    { 

     private final SimpleStringProperty name; 
     private final SimpleStringProperty department; 

     private Employee(String name, String department) 
     { 
      this.name = new SimpleStringProperty(name); 
      this.department = new SimpleStringProperty(department); 
     } 

     public String getName() 
     { 
      return name.get(); 
     } 

     public void setName(String fName) 
     { 
      name.set(fName); 
     } 

     public String getDepartment() 
     { 
      return department.get(); 
     } 

     public void setDepartment(String fName) 
     { 
      department.set(fName); 
     } 
    } 

    class MyTreeCell extends TextFieldTreeCell<String> 
    { 
     private ContextMenu rootContextMenu; 

     public MyTreeCell() 
     { 
      // instantiate the root context menu 
      rootContextMenu 
       = ContextMenuBuilder.create() 
       .items(
        MenuItemBuilder.create() 
        .text("Menu Item") 
        .onAction(
         new EventHandler<ActionEvent>() 
         { 
          @Override 
          public void handle(ActionEvent arg0) 
          { 
           System.out.println("Menu Item Clicked!"); 
          } 
         } 
        ) 
        .build() 
       ) 
       .build(); 
     } 

     @Override 
     public void updateItem(String item, boolean empty) 
     { 
      super.updateItem(item, empty); 

      // if the item is not empty and is a root... 
      if (!empty && getTreeItem().getParent() == null) 
      { 
       setContextMenu(rootContextMenu); 
      } 
     } 
    } 

} 

답변

8

셀 공장에 할당하는 대신 문맥 메뉴를 TreeView에 지정해야합니다.

import java.util.Arrays; 
import java.util.List; 
import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.ContextMenuBuilder; 
import javafx.scene.control.MenuItemBuilder; 
import javafx.scene.control.TreeCell; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeView; 
import javafx.scene.control.cell.TextFieldTreeCell; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class Test extends Application 
{ 
    List<Employee> employees = Arrays.<Employee>asList(
     new Employee("New Chassi", "New Datacenter"), 
     new Employee("New Battery", "New Rack"), 
     new Employee("New Chassi", "New Server"), 
     new Employee("Anna Black", "Sales Department"), 
     new Employee("Rodger York", "Sales Department"), 
     new Employee("Susan Collins", "Sales Department"), 
     new Employee("Mike Graham", "IT Support"), 
     new Employee("Judy Mayer", "IT Support"), 
     new Employee("Gregory Smith", "IT Support"), 
     new Employee("Jacob Smith", "Accounts Department"), 
     new Employee("Isabella Johnson", "Accounts Department")); 
    TreeItem<String> rootNode = new TreeItem<>("MyCompany Human Resources"); 

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

    TreeView<String> treeView = new TreeView<>(rootNode); 

    @Override 
    public void start(Stage stage) 
    { 

     // instantiate the root context menu 
     ContextMenu rootContextMenu 
      = ContextMenuBuilder.create() 
      .items(
       MenuItemBuilder.create() 
       .text("Menu Item") 
       .onAction(
        new EventHandler<ActionEvent>() 
        { 
         @Override 
         public void handle(ActionEvent arg0) 
         { 
          System.out.println("Menu Item Clicked!"); 
         } 
        } 
       ) 
       .build() 
      ) 
      .build(); 

     treeView.setContextMenu(rootContextMenu); 

     rootNode.setExpanded(true); 
     for (Employee employee : employees) 
     { 
      TreeItem<String> empLeaf = new TreeItem<>(employee.getName()); 
      boolean found = false; 
      for (TreeItem<String> depNode : rootNode.getChildren()) 
      { 
       if (depNode.getValue().contentEquals(employee.getDepartment())) 
       { 
        depNode.getChildren().add(empLeaf); 
        found = true; 
        break; 
       } 
      } 
      if (!found) 
      { 
       TreeItem<String> depNode = new TreeItem<>(
        employee.getDepartment()//,new ImageView(depIcon) // Set picture 
       ); 
       rootNode.getChildren().add(depNode); 
       depNode.getChildren().add(empLeaf); 
      } 
     } 

     stage.setTitle("Tree View Sample"); 
     VBox box = new VBox(); 
     final Scene scene = new Scene(box, 400, 300); 
     scene.setFill(Color.LIGHTGRAY); 


     box.getChildren().add(treeView); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static class Employee 
    { 

     private final SimpleStringProperty name; 
     private final SimpleStringProperty department; 

     private Employee(String name, String department) 
     { 
      this.name = new SimpleStringProperty(name); 
      this.department = new SimpleStringProperty(department); 
     } 

     public String getName() 
     { 
      return name.get(); 
     } 

     public void setName(String fName) 
     { 
      name.set(fName); 
     } 

     public String getDepartment() 
     { 
      return department.get(); 
     } 

     public void setDepartment(String fName) 
     { 
      department.set(fName); 
     } 
    } 


} 
1

ContextMenuBuilderMenuItemBuilder가 (허용 대답에 사용되는) 자바 FX 8에서 사용되지 않으며 이후 릴리스에서 제거 될 예정입니다 : 다음 상황에 맞는 메뉴의 작업과 코드입니다.

MenuItem entry1 = new MenuItem("Test with Icon", graphicNode); 
entry1.setOnAction(ae -> ...); 
MenuItem entry2 = new MenuItem("Test without Icon"); 
entry2.setOnAction(ae -> ...); 

myTreeView.setContextMenu(new ContextMenu(entry1, entry2)); 
: 두 항목에 아이콘이없는 아이콘 하나 하나를 가진 자바 FX 8 예에 따라