2014-02-14 23 views
2

我正在構建下面的JavAFX,我對它完全陌生。這裏是什麼樣子:JavaFX:將TextArea綁定到所選TreeItem的元素(包含在TreeView中)

http://i.imgur.com/nfzQzIY.png

正如你可以看到有左側以及一些TextArea S IN中心TreeView。請忽略其餘部分。

左側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由建閱讀Plug小號斷的SQL數據庫,創建PlugTreeItem對象,插頭連接到PlugTreeItem然後補充說,樹的根節點(這是最初創建的,作爲一個虛擬的),其中有我們做的TreeView注:結果_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); 
} 

最後,我有一些TextAreas,就像你在應用截圖中看到的那樣。我希望那些能夠反映TreeView中選定的PlugTreeItem的元素,讓我們從插入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的特定字段上添加第二個偵聽器,該字段已從字符串更改爲StringProperty,以便它變爲ObservableValue。但是,即使將TextArea的textProperty與StringProperty綁定後,它也不會更改其內容。

我知道我可能因爲它的大小而錯誤地回答了我的問題。請不要猶豫,問我任何額外的信息或代碼,我可能已經省略或你認爲imoprtant。

+0

看起來像這樣的「乞討問題」...是否有意義將TreeItem綁定到TextArea?對於大多數情況,我認爲將兩者都綁定到基礎模型值是更有意義的。不是說這個Q/A是錯誤的,儘管恕我直言,它可能不是最佳設計。 – Joel

回答

3

我不會爲此創建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(); 
     } 
    } 
} 
相關問題