2013-04-24 3 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 1 и test data 2. Как я могу это исправить?

+0

@Dukeling Я использую JavaFX в oeder для создания графического интерфейса пользователя. Эта строка 'setText (list.get (i) .getConenctionname());' используется для печати строк в интерфейсе. –

ответ

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

Да! Это решает проблему. Спасибо! –

Смежные вопросы