2014-02-14 3 views
2

다음 JavAFX를 빌드 중이며 완전히 익숙합니다. 모양은 다음과 같습니다JavaFX : 선택한 TreeItem의 요소에 TreeArea 바인딩 (TreeView에 포함)

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

왼쪽뿐만 아니라 중앙에 일부 TextArea들에 TreeView 거기에 볼 수 있듯이. 나머지는 무시하십시오.

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에 의해 만들어집니다 : 왼쪽 TreeView

영숫자 문자열은 내가 지금처럼 Plug 항목에 대한 추가 홀더를 TreeItem를 확장하도록 구축 한 PlugTreeItem 클래스 객체이다 참고 : (더미로, 초기에 생성 된) 트리의 루트 노드로, 그 중 우리가 TreeView를 만드는 것이 추가 한 후 PlugTreeItem에 플러그를 연결, PlugTreeItem 객체를 생성하여 SQL DB 떨어져 Plug의 읽기을 결과 _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가 있습니다. 그 사람들이 선택한 PlugTreeItem의 요소를 TreeView에 반영하기를 원합니다. 왼쪽에서 볼 수있는 값과 동일한 값을 반영하려는 Plug MAC TextArea로 시작해 보겠습니다.

그래서 사용자가 TreeItem에 클릭 할 때마다의 selectedTreeItem가 업데이트되는 것을 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로 바인딩 한 후에도 내용은 변경되지 않습니다.

크기 때문에 내 질문에 잘못 말했을 수 있습니다. 추가 정보 나 코드가 누락되었거나 귀하가 모순이라고 생각하면 언제든지 물어보십시오.

+0

"이런 질문을합니다."... TreeItem을 TextArea에 바인딩하는 것이 합리적입니까? 대부분의 경우 두 모델을 기본 모델 값에 바인딩하는 것이 더 바람직하다고 생각합니다. 이 Q/A가 잘못되었다는 말은 아니지만 IMHO를 통해 최적의 디자인이 될 가능성은 희박합니다. – 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(); 
     } 
    } 
} 
관련 문제