DeepSidhu1313
DeepSidhu1313

Reputation: 805

Javafx Add children dynamically to treeview using Thread?

I'm new to javafx, trying to implement it in my project work. I'm having problem while adding ip's to a tree view.

AddNodes.java

package ui;

import db.SQLiteJDBC;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Nika
 */
public class AddNodes implements Runnable{
    CustomTree alltree,livetree,offlinetree;
    SQLiteJDBC treedb= new SQLiteJDBC();
    String sql;
    ResultSet rs;

    public AddNodes() {
    }

    @Override
    public void run() {
        while(true){
            alltree= new CustomTree();
            livetree= new CustomTree();
            offlinetree= new CustomTree();
            try {
                sql="SELECT IP FROM Nodes;";
                rs=treedb.select("workspace/appdb/nodes.db", sql);
                alltree.setSimpleRoot("all");
                alltree.setRootNode();
                while(rs.next()){
                    alltree.setSimpleBranchNode(rs.getString("IP"));
                    System.out.println(""+rs.getString("IP"));
                }
                rs.close();
                UI.tab22.setContent(alltree.getTree());
            } catch (SQLException ex) {
                Logger.getLogger(AddNodes.class.getName()).log(
                        Level.SEVERE, null, ex);
            }

            try {
                Thread.sleep(10000);
            } catch (InterruptedException ex) {
                Logger.getLogger(AddNodes.class.getName()).log(
                        Level.SEVERE, null, ex);
            }
        }
    }
}

here tab22 is a static member of UI class, pardon me if i had not followed java coding style. the thing i'm trying to achieve is that if any change on Database or in IP's list happens it also has to reflect on Tree in tab22.

Here is another file CustomTree.java

/**
 * 
 * @author Nika
 */
public class CustomTree {

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

    public CustomTree() {
    }

    public void setSimpleRoot(String text) {
        rootNode = new TreeItem<String>(text);
    }

    public void setCheckboxRoot(String text) {
        rootNode = new CheckBoxTreeItem<>(text);
    }

    public void setExpanded(boolean b) {
        rootNode.setExpanded(b);
    }

    public void setRootNode() {
        treeView.setRoot(rootNode);
    }

    public TreeView getTree() {
        return treeView;
    }

    public void setTreeEditable(boolean b) {
        treeView.setEditable(b);
    }

    public void setSimpleBranchNode(String text) {
        TreeItem<String> branch = new TreeItem<String>(text);
        rootNode.getChildren().add(branch);
    }

    public void setSimpleLeafNode(TreeItem branch, String text) {
        TreeItem<String> leaf = new TreeItem<String>(text);
        branch.getChildren().add(leaf);
    }

    public void setCheckboxBranchNode(String text) {
        TreeItem<String> branch = new TreeItem<String>(text);
        rootNode.getChildren().add(branch);
    }

    public void setCheckboxLeafNode(TreeItem branch, String text) {
        TreeItem<String> leaf = new TreeItem<String>(text);
        branch.getChildren().add(leaf);
    }

    public void start(Stage stage) {
        /*
         * for () { 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); } }
         * 
         * 
         * TreeView<String> treeView = new TreeView<String>(rootNode);
         * treeView.setCellFactory(new
         * Callback<TreeView<String>,TreeCell<String>>(){
         * 
         * @Override public TreeCell<String> call(TreeView<String> p) { return
         * new TextFieldTreeCellImpl(); } });
         */
    }
}

Thanks!

Upvotes: 0

Views: 1828

Answers (1)

brian
brian

Reputation: 10979

All changes done to the scene must be on the javafx GUI Thread using Platform.runLater.

 Platform.runLater(new Runnable() {
             @Override
             public void run() {
                  UI.tab22.setContent(alltree.getTree());
             }
         });

Upvotes: 1

Related Questions