我是 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/