2014-02-15 3 views
1

Я нашел этот пример дерева JavaFX.Как создать дерево JavaFX с объектами

import java.util.Arrays; 
import java.util.List; 
import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TreeCell; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeView; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class MainApp extends Application 
{ 

    private final Node rootIcon = new ImageView(new Image(getClass().getResourceAsStream("/images/root.png"))); 
    private final Image depIcon = new Image(getClass().getResourceAsStream("/images/department.png")); 

    List<Employee> employees = Arrays.<Employee>asList(
     new Employee("Ethan Williams", "Sales Department", "Ethan Williams", "Sales Department"), 
     new Employee("Emma Jones", "Sales Department", "Emma Jones", "Sales Department"), 
     new Employee("Michael Brown", "Sales Department", "Michael Brown", "Sales Department"), 
     new Employee("Anna Black", "Sales Department", "Anna Black", "Sales Department"), 
     new Employee("Rodger York", "Sales Department", "Rodger York", "Sales Department"), 
     new Employee("Susan Collins", "Sales Department", "Susan Collins", "Sales Department"), 
     new Employee("Mike Graham", "IT Support", "Mike Graham", "IT Support"), 
     new Employee("Judy Mayer", "IT Support", "Judy Mayer", "IT Support"), 
     new Employee("Gregory Smith", "IT Support", "Gregory Smith", "IT Support"), 
     new Employee("Jacob Smith", "Accounts Department", "Jacob Smith", "Accounts Department"), 
     new Employee("Isabella Johnson", "Accounts Departmentllzzz", "Isabella Johnson", "Accounts Departmentllzzz"), 
     new Employee("Isabella Johnson", "Accounts Departmentllzzz", "Isabella Johnson", "Accounts Departmentllzzz"), 
     new Employee("Isabella Johnson", "Accounts Departmentllzzz", "Isabella Johnson", "Accounts Departmentllzzz")); 
    TreeItem<String> rootNode = new TreeItem<String>("MyCompany Human Resources", rootIcon); 

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

    @Override 
    public void start(Stage stage) 
    { 
     rootNode.setExpanded(true); 
     for (Employee employee : employees) 
     { 
      TreeItem<String> empLeaf = new TreeItem<String>(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 depNode = new TreeItem(employee.getDepartment(), 
        new ImageView(depIcon) 
       ); 
       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<String> treeView = new TreeView<String>(rootNode); 
     treeView.setShowRoot(true); 
     treeView.setEditable(false); 
     treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() 
     { 
      @Override 
      public TreeCell<String> call(TreeView<String> p) 
      { 
       return new TextFieldTreeCellImpl(); 
      } 
     }); 

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

    private final class TextFieldTreeCellImpl extends TreeCell<String> 
    { 

     private TextField textField; 
     private ContextMenu addMenu = new ContextMenu(); 

     public TextFieldTreeCellImpl() 
     { 
      MenuItem addMenuItem = new MenuItem("Add Employee"); 
      addMenu.getItems().add(addMenuItem); 
      addMenuItem.setOnAction(new EventHandler() 
      { 
       @Override 
       public void handle(Event t) 
       { 
        TreeItem newEmployee = new TreeItem<String>("New Employee"); 
        getTreeItem().getChildren().add(newEmployee); 
       } 
      }); 
     } 

     @Override 
     public void startEdit() 
     { 
      super.startEdit(); 

      if (textField == null) 
      { 
       createTextField(); 
      } 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
     } 

     @Override 
     public void cancelEdit() 
     { 
      super.cancelEdit(); 

      setText((String) getItem()); 
      setGraphic(getTreeItem().getGraphic()); 
     } 

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

      if (empty) 
      { 
       setText(null); 
       setGraphic(null); 
      } 
      else 
      { 
       if (isEditing()) 
       { 
        if (textField != null) 
        { 
         textField.setText(getString()); 
        } 
        setText(null); 
        setGraphic(textField); 
       } 
       else 
       { 
        setText(getString()); 
        setGraphic(getTreeItem().getGraphic()); 
        if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) 
        { 
         setContextMenu(addMenu); 
        } 
       } 
      } 
     } 

     private void createTextField() 
     { 
      textField = new TextField(getString()); 
      textField.setOnKeyReleased(new EventHandler<KeyEvent>() 
      { 

       @Override 
       public void handle(KeyEvent t) 
       { 
        if (t.getCode() == KeyCode.ENTER) 
        { 
         commitEdit(textField.getText()); 
        } 
        else if (t.getCode() == KeyCode.ESCAPE) 
        { 
         cancelEdit(); 
        } 
       } 
      }); 

     } 

     private String getString() 
     { 
      return getItem() == null ? "" : getItem().toString(); 
     } 
    } 

    public static class Employee 
    { 

     private final SimpleStringProperty name; 
     private final SimpleStringProperty department; 
     private final SimpleStringProperty test; 
     private final SimpleStringProperty testtwo; 


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

     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); 
     } 



     public String getTest() 
     { 
      return test.get(); 
     } 

     public void setTest(String testd) 
     { 
      test.set(testd); 
     } 



     public String getTesttwo() 
     { 
      return testtwo.get(); 
     } 

     public void setTesttwo(String fNdme) 
     { 
      testtwo.set(fNdme); 
     } 
    } 
} 

Оригинальный пример: http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm

Как вы можете видеть, я проверил, чтобы развернуть дерево, но это не работает. Как я могу использовать, например, список объектов для отображения сложного дерева?

+0

Вы должны сказать, что вы хотите сделать с объектом. Я сделал пример [здесь.] (Http://stackoverflow.com/a/21790739/2855515) TextFieldTreeCellImpl - это только если вы хотите изменить имя в дереве. Возможно, вам это не понадобится. – brian

+0

Я пробовал это, и корневой узел появился расширенным. Каким образом он «не работает»? –

ответ

4

Здесь я проиллюстрирован простым примером шаг за шагом.

1: -Desing часть
enter image description here

2: -controller часть: -
/* * Для того, чтобы изменить заголовок лицензии, выберите Лицензионные заголовки в свойствах проекта. * Чтобы изменить этот шаблонный файл, выберите «Инструменты» | Шаблоны * и откройте шаблон в редакторе. */ package TreeViewDemo;

import java.net.URL; 
    import java.util.ArrayList; 
    import java.util.ResourceBundle; 
    import javafx.event.ActionEvent; 
    import javafx.fxml.FXML; 
    import javafx.fxml.Initializable; 
    import javafx.scene.Node; 
    import javafx.scene.control.Button; 
    import javafx.scene.control.TreeItem; 
    import javafx.scene.control.TreeView; 
    import javafx.scene.image.Image; 
    import javafx.scene.image.ImageView; 
    /** 
    * 
     * @author maulik.patel 
    */ 
    public class TreeViewController implements Initializable 
    { 
    /* =================== FXML Variable ================ */ 
    @FXML TreeView<String> view_root; 
    @FXML Button show_tree; 

    /* =================== Internal Variable ============ */ 
    Node rootIcon = new ImageView(newImage(getClass().getResourceAsStream("home.jpg"))); 
    TreeItem<String> root_item=new TreeItem<>("City", rootIcon); 
    ArrayList<StudentModel> list_of_student; 

    /* ====================== getscreen ================== */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) 
    { 
     list_of_student=new ArrayList<>(); 
    } 
    /* ================== Fxml Method =============== */ 
    @FXML 
    private void show_tree(ActionEvent event) 
    { 
    view_root.setRoot(root_item); 
    getdata(); 
    for(StudentModel student:list_of_student) 
    { 
      if (!City_check(student)) 
      { 
      City_check(student); 
      } 
    } 
    } 
    /*============ Internal Method ================= */ 

    //========== For City ==============// 
    public boolean City_check(StudentModel student) 
    { 
    boolean flag = false; 
    for (TreeItem<String> item : root_item.getChildren()) 
    { 
     if (item.getValue().equals(student.getCity())) { 
      flag = true; 
      if (!Age_Check(student, item)) { 
       Age_Check(student, item); 
      } 
      break; 
     } 
    } 
    if (!flag) 
    { 
     TreeItem<String> item = new TreeItem<>(student.getCity()); 
     root_item.getChildren().add(item); 
     return false; 
    } 
    return true; 
} 
    //============ For Age ===============// 
    public boolean Age_Check(StudentModel student, TreeItem<String> item) 
     { 
     boolean flag = false; 
     for (TreeItem<String> age : item.getChildren()) 
    { 
     if (age.getValue().equals(student.getAge())) { 
      flag = true; 
      // ============= For Name ==============// 
      TreeItem<String> name = new TreeItem<>(student.getStudent_name()); 
      age.getChildren().add(name); 
      break; 
     } 
    } 
    if (!flag) 
    { 
     TreeItem<String> age = new TreeItem<>(student.getAge()); 
     item.getChildren().add(age); 
     return false; 
    } 
    return true; 
} 
private void getdata() 
{ 
    list_of_student.add(new StudentModel("Maulik", "15", "Surat")); 
    list_of_student.add(new StudentModel("Kishan", "15", "Surat")); 
    list_of_student.add(new StudentModel("Parth", "5", "Ahmedabad")); 
    list_of_student.add(new StudentModel("Kunal", "35", "Baroda")); 
    list_of_student.add(new StudentModel("Hardik", "25", "Ahmedabad")); 
    list_of_student.add(new StudentModel("Mehul", "18", "Rajkot")); 
    } 
} 

3: - javaben класс: -

package TreeViewDemo; 

/* 
    * To change this license header, choose License Headers in Project Properties. 
    * To change this template file, choose Tools | Templates 
    * and open the template in the editor. 
    */ 

/** 
    * 
    * @author maulik.patel 
*/ 
public class StudentModel 
{ 
    private String student_name; 
    private String age; 
    private String city; 

//------------- constructor ------------// 
public StudentModel(String student_name, String age, String city) 
{ 
    this.student_name = student_name; 
    this.age = age; 
    this.city = city; 
} 

public String getStudent_name() { 
    return student_name; 
} 

public String getAge() { 
    return age; 
} 

public String getCity() { 
    return city; 
} 
} 
Смежные вопросы