【问题标题】:Javafx Add children dynamically to treeview using Thread?Javafx 使用线程将子项动态添加到树视图?
【发布时间】:2014-05-27 22:11:11
【问题描述】:

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

这里的 tab22 是 UI 类的静态成员,如果我没有遵循 java 编码风格,请原谅我。我想要实现的事情是,如果数据库或 IP 列表中发生任何更改,它也必须反映在 tab22 中的树上。

这是另一个文件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(); } });
         */
    }
}

谢谢!

【问题讨论】:

    标签: java user-interface javafx treeview javafx-8


    【解决方案1】:

    对场景所做的所有更改都必须在 javafx GUI 线程上使用 Platform.runLater.

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

    【讨论】:

    • 但是它使用Platform.runLater(new AddNodes());进入循环并且UI没有响应
    • 只有改变场景的方法需要在运行后执行。我认为修改场景的代码的唯一部分是UI.tab22.setContent(..)。从线程中读取数据库就可以了。
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多