Javafx 使用线程将子项动态添加到 TreeView ?

标签 java user-interface javafx treeview javafx-8

我是 javafx 新手,试图在我的项目工作中实现它。我在将 IP 添加到 TreeView 时遇到问题。

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 列表发生任何更改,它也必须反射(reflect)在 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(); } });
         */
    }
}

谢谢!

最佳答案

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

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

关于Javafx 使用线程将子项动态添加到 TreeView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899815/

相关文章:

JavaFX 2.2 : How to implement a new Chart that extends LineChart

java - 获取 AccessibleName 属性

java - Swing 应用程序未在 JPanel 内绘制 JComponent

java - 以下代码段有什么区别?

java - 该查询的 Hibernate 等效项是什么?(添加两列)

java - java 导入如何工作(swing)?

java - 跟踪运行时拖动事件的进度。 JavaFX

java - 线程 "main"java.util.InputMismatchException : For input string: "1234567891011" 中出现异常

Java Swing GUI 沙漏

java - 适当事件后图形不显示