ArrayList显示不正确

时间:2013-04-24 13:08:16

标签: java arraylist javafx

我正在测试将Array List显示为JavaFX手风琴:

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。我怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题出在ConnectionsCellFactory,为List中的每个项调用方法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());
        }
    }
}