Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx是否使用线程将子项动态添加到treeview?_Java_User Interface_Javafx_Treeview_Javafx 8 - Fatal编程技术网

Javafx是否使用线程将子项动态添加到treeview?

Javafx是否使用线程将子项动态添加到treeview?,java,user-interface,javafx,treeview,javafx-8,Java,User Interface,Javafx,Treeview,Javafx 8,我是javafx新手,试图在我的项目工作中实现它。将ip添加到树视图时出现问题 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 clas

我是javafx新手,试图在我的项目工作中实现它。将ip添加到树视图时出现问题

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);
            }
        }
    }
}
/**
 * 
 * @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(); } });
         */
    }
}
这里tab22是UI类的静态成员,请原谅我没有遵循java编码风格。我试图实现的是,如果数据库或IP列表发生任何更改,它也必须反映在tab22中的树上

这里是另一个文件CustomTree.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);
            }
        }
    }
}
/**
 * 
 * @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(); } });
         */
    }
}
/**
* 
*@作者尼卡
*/
公共类自定义树{
树根节;
TreeView TreeView=新的TreeView();
公共自定义树(){
}
公共void setImpleRoot(字符串文本){
rootNode=新树项(文本);
}
public void setCheckboxRoot(字符串文本){
rootNode=新的CheckBoxTreeItem(文本);
}
公共void setExpanded(布尔b){
rootNode.setExpanded(b);
}
public void setRootNode(){
setRoot(rootNode);
}
公共树视图getTree(){
返回树视图;
}
公共void setTreeEditable(布尔b){
treeView.setEditable(b);
}
public void setSimpleBranchNode(字符串文本){
TreeItem分支=新的TreeItem(文本);
rootNode.getChildren().add(分支);
}
public void setSimpleAfNode(树元素分支,字符串文本){
TreeItem叶=新的TreeItem(文本);
branch.getChildren().add(叶);
}
public void setCheckboxBranchNode(字符串文本){
TreeItem分支=新的TreeItem(文本);
rootNode.getChildren().add(分支);
}
public void setCheckboxLeafNode(树元素分支,字符串文本){
TreeItem叶=新的TreeItem(文本);
branch.getChildren().add(叶);
}
公众假期开始(阶段){
/*
*对于(){TreeItem empLeaf=new
*TreeItem(employee.getName());布尔值find=false;用于
*(TreeItem depNode:rootNode.getChildren()){if
*(depNode.getValue().contentEquals(employee.getDepartment())){
*depNode.getChildren().add(empLeaf);found=true;break;}if
*(!found){//TreeItem depNode=new
*TreeItem(employee.getDepartment(),//新图像视图(depIcon)//)//
*rootNode.getChildren().add(depNode)//
*depNode.getChildren().add(empLeaf);}
* 
* 
*TreeView TreeView=新的TreeView(rootNode);
*treeView.setCellFactory(新)
*回调函数(){
* 
*@Override public TreeCell调用(TreeView p){return
*新文本字段treecellimpl();}});
*/
}
}

谢谢

对场景所做的所有更改必须在JavaFXGUI线程上使用


但它使用
Platform.runLater(newaddnodes())进入循环和UI不响应只有更改场景的方法需要稍后运行。我认为您的代码中唯一修改场景的部分是
UI.tab22.setContent(…)
。可以从线程读取数据库。