2013-04-24 111 views
0

我測試顯示數組列表到JavaFX手風琴:ArrayList中顯示不正確

public class Navigation { 

    // Object for storing conenctions 
    public static List<dataObj> list = new ArrayList<>(); 
    private ObservableList<dataObj> data; 

    public class dataObj { 

     private String conenctionname; 

     public dataObj(String conenctionname) { 
      this.conenctionname = conenctionname; 
     } 

     public String getConenctionname() { 
      return conenctionname; 
     } 

     public void setConenctionname(String conenctionname) { 
      this.conenctionname = conenctionname; 
     } 
    } 

    public void initNavigation(Stage primaryStage, Group root, Scene scene) { 

     VBox stackedTitledPanes = createStackedTitledPanes(); 

     ScrollPane scroll = makeScrollable(stackedTitledPanes); 
     scroll.getStyleClass().add("stacked-titled-panes-scroll-pane"); 
     scroll.setPrefSize(395, 580); 
     scroll.setLayoutX(5); 
     scroll.setLayoutY(32); 

     root.getChildren().add(scroll); 

    } 

    private ScrollPane makeScrollable(final VBox node) { 
     final ScrollPane scroll = new ScrollPane(); 
     scroll.setContent(node); 
     scroll.viewportBoundsProperty().addListener(new ChangeListener<Bounds>() { 
      @Override 
      public void changed(ObservableValue<? extends Bounds> ov, Bounds oldBounds, Bounds bounds) { 
       node.setPrefWidth(bounds.getWidth()); 
      } 
     }); 
     return scroll; 
    } 

    ///////////////////////////////////////////////////////////////////////////////////// 
    // Generate accordition with Connections, Tables and Description 
    private VBox createStackedTitledPanes() { 
     VBox stackedTitledPanes = new VBox(); 
     stackedTitledPanes.getChildren().setAll(
       createConnectionsList("Connections")); 
     ((TitledPane) stackedTitledPanes.getChildren().get(0)).setExpanded(true); 
     stackedTitledPanes.getStyleClass().add("stacked-titled-panes"); 

     return stackedTitledPanes; 
    } 

    ////////////////////////////////////////////////////////////////////////////// 
    // Generate list with Connections 
    public TitledPane createConnectionsList(String title) { 

     initObject(); 

     data = FXCollections.observableArrayList(list); 

     ListView<dataObj> lv = new ListView<>(data); 

     lv.setCellFactory(new Callback<ListView<dataObj>, ListCell<dataObj>>() { 
      @Override 
      public ListCell<dataObj> call(ListView<dataObj> p) { 
       return new ConnectionsCellFactory(); 
      } 
     }); 
     AnchorPane content = new AnchorPane(); 
     content.getChildren().add(lv); 
     // add to TitelPane 
     TitledPane pane = new TitledPane(title, content); 
     return pane; 
    } 

    static class ConnectionsCellFactory extends ListCell<dataObj> { 

     @Override 
     public void updateItem(dataObj item, boolean empty) { 
      super.updateItem(item, empty); 
      if (item != null) { 

       for (int i = 0; i < list.size(); i++) { 
        setText(list.get(i).getConenctionname()); 
       } 



      } 
     } 
    } 

    // Insert Some test data 
    public void initObject() { 

     dataObj test1 = new dataObj("test data 1"); 
     dataObj test2 = new dataObj("test data 2"); 

     list.add(test1); 
     list.add(test2); 

    } 
} 

但由於某些原因,我無法從數組列表獲取對象的正確列表並顯示出來。我得到這樣的結果:

enter image description here

正確的結果應該是test data 1test data 2。我如何解決這個問題?

+0

@Dukeling我使用的JavaFX在oeder構建用戶界面。這行'setText(list.get(i).getConenctionname())'用於將字符串打印到界面中。 – 2013-04-24 13:16:51

回答

1

問題出在ConnectionsCellFactory,方法updateItem被稱爲列表中的每個項目。因此,在你的代碼,每一個細胞要設置的每個項目的文字列表中的

你應該嘗試:

static class ConnectionsCellFactory extends ListCell<dataObj> { 

    @Override 
    public void updateItem(dataObj item, boolean empty) { 
     super.updateItem(item, empty); 
     if (item != null) { 
      setText(item.getConenctionname()); 
     } 
    } 
} 
+0

是的!這解決了這個問題。謝謝! – 2013-04-24 13:19:03