Javafx是否使用线程将子项动态添加到treeview?
我是javafx新手,试图在我的项目工作中实现它。将ip添加到树视图时出现问题 AddNodes.javaJavafx是否使用线程将子项动态添加到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
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(…)
。可以从线程读取数据库。