JavaFX:将TextArea绑定到所选TreeItem的元素(包含在TreeView中)



我正在构建以下JavAFX,我对它还很陌生。以下是它的样子:

https://i.stack.imgur.com/SalXr.png

正如你所看到的,左边有一个TreeView,中间也有一些TextArea。请忽略其余部分。

左侧TreeView上的字母数字字符串是PlugTreeItem类对象,我构建这些对象是为了扩展TreeItem,并为Plug项添加了一个占位符,如下所示:

public class PlugTreeItem<T> extends TreeItem{
private Plug plugItem = null;
//########################### PROCS ########################################
public PlugTreeItem(Object t, Plug pl) {
super(t);
plugItem = pl;
}
public PlugTreeItem(Object t, Node node, Plug pl) {
super(t, node);
plugItem = pl;
}
public void setPlugItem(Plug plugItem) {
this.plugItem = plugItem;
}
public Plug getPlugItem() {
return plugItem;
}
}

TreeView是通过从SQL数据库中读取Plug来构建的,创建PlugTreeItem对象,将插件链接到PlugTreeItem,然后将其添加到树的根节点(最初创建为一个伪节点),由此我们生成TreeView注意:result_set包含SQL结果矩阵。MAC是包含您在屏幕截图左侧看到的地址的字段。

treeItemRoot = new PlugTreeItem<>("Active Plugs", new Plug());          //Root of the tree, contains a dummy Plug object.
selectedTreeItem = treeItemRoot;  //Holder of our currently selected TreeItem, see Listener below.
TreeView<String> treeView = new TreeView<>(treeItemRoot);
while(result_set.next()){
Plug pl = null;                                         
pl = new Plug(result_set.getString("SIHUid"), result_set.getString("sensorID"), result_set.getString("Location"), result_set.getString("Appliance"), result_set.getString("Type"), result_set.getString("connection"));
PlugTreeItem<String> pti = new PlugTreeItem(pl.getMAC(),pl);
treeItemRoot.getChildren().add(pti);
}

最后,我得到了一些文本区域,正如你在应用程序的屏幕截图中看到的那样。我希望它们反映TreeView中所选PlugTreeItem的元素,让我们从Plug MAC TextArea开始,我希望它反映与您在左侧看到的值相同的值。

我在selectedTreeItem中添加了以下监听器,这样每当用户单击TreeItem时,selectedTreeItem就会更新并保存对特定PlugTreeItem的引用:

treeView.getSelectionModel().selectedItemProperty().addListener( new ChangeListener() {     
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
selectedTreeItem = (PlugTreeItem<String>) newValue;
System.out.println("Selection plug MAC: " + selectedTreeItem.getPlugItem().getMAC());           //MARKER: REMOVE
// do what ever you want 
}
});

System.out命令确认,每当我点击树上的不同项目时,我点击的MAC地址就会被打印出来。

我如何告诉我的TextAreas"嘿,听selectedTreeItem。每当它改变时,获取一个特定的值并将其设置为您的文本"?

我已经尝试在Plug的特定字段上添加第二个Listener,我已经将其从String更改为StringProperty,使其成为ObservableValue。然而,即使在将TextArea的textProperty与StringProperty绑定之后,它也不会更改其内容。

我知道我的问题可能因为篇幅太大而措辞错误。请不要犹豫,询问我可能遗漏或您认为重要的任何其他信息或代码

我不会为此创建TreeItem的子类。它被设计用于任何物体。对于TextArea绑定,只需在更改了选择的侦听器中绑定和取消绑定即可。

package treebind;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class TreeBind extends Application {
@Override
public void start(Stage primaryStage) {
TreeItem<Plug> treeItemRoot = new TreeItem<>(new Plug("root","a"));
TreeView<Plug> treeView = new TreeView<>(treeItemRoot);
for (int i=0;i<10;i++)
treeItemRoot.getChildren().add(new TreeItem<>(new Plug("name"+String.valueOf(i),"")));
treeView.setMinWidth(150);
final TextArea ta1 = new TextArea();
treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
if (oldValue!=null){
((TreeItem<Plug>)oldValue).getValue().s1.unbindBidirectional(ta1.textProperty());
ta1.clear();
}
if (newValue!=null){
ta1.setText(((TreeItem<Plug>)newValue).getValue().s1.getValue());
((TreeItem<Plug>)newValue).getValue().s1.bindBidirectional(ta1.textProperty());
}
}
});
HBox root = new HBox();
root.getChildren().addAll(treeView,ta1);
Scene scene = new Scene(root, 400, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
private class Plug{
public final StringProperty name, s1;
Plug(String name, String s1){
this.name = new SimpleStringProperty(name);
this.s1 = new SimpleStringProperty(s1);
}
@Override
public String toString(){
return name.getValue();
}
}
}

最新更新