ListView 中的选定项目隐藏了 JavaFX

Selected item in ListView hides JavaFX

我有一个 ListView,我添加了 BorderPane 元素 和一些内容。


当我 select 一项时,它会隐藏。

我该如何解决这个问题?

The white item is the selected item. Is hidden.

我没有CSS在listView中一无所有

UPDATE:

边框内容

public BorderPane getUserBox()
{
    BorderPane borderPane = new BorderPane();

    HBox mainPane = new HBox();


    mainPane.prefWidthProperty().bind(borderPane.prefWidthProperty());
    mainPane.minWidthProperty().bind(borderPane.minWidthProperty());
    mainPane.maxWidthProperty().bind(borderPane.maxWidthProperty());

    ImageView image = new ImageView(Images.CLOSE_ICON);

    Label nick = new Label("  Name");
    Label text = new Label("  Text ");

    VBox vBox = new VBox();
    vBox.getChildren().addAll(nick, text);

    Label time = new Label("   4.06.2016");

    mainPane.getChildren().addAll(image, vBox, time);

    borderPane.getStyleClass().add("userBox");

    borderPane.setCenter(mainPane);

    return borderPane;
}

添加边框窗格

    UserBox userBox = new UserBox();

    ObservableList<BorderPane> items =FXCollections.observableArrayList (
    userBox.getUserBox(), userBox.getUserBox(), userBox.getUserBox(),    userBox.getUserBox());

    listUsersBox.setItems(items);

我在borderPane里只有这个css

.userBox {

    -fx-background-color: green;

}

嗯,所以在使用 ListView 时,您不应将图形元素直接放入 ListView,而应使用 setCellFactory 告诉 ListView 如何显示元素。

Customizing ListView Visuals

The visuals of the ListView can be entirely customized by replacing the default cell factory. A cell factory is used to generate ListCell instances, which are used to represent an item in the ListView. See the Cell class documentation for a more complete description of how to write custom Cells.

作为数据源,您应该有一个数据模型,用一些真实信息填充图形表示。

在下面的示例中,我创建了一个 User class,它是列表视图(列表视图显示用户)中单个元素的模型。然后我使用上述方法为每个用户创建了一个 GUI 布局(请注意,您甚至不需要 BorderPane,因为您只填充了中心)。

例子

User.java

public class User {

    private StringProperty nick = new SimpleStringProperty();
    private StringProperty text = new SimpleStringProperty();
    private ObjectProperty<Date> time = new SimpleObjectProperty<Date>();

    public StringProperty nickProperty(){ return nick;}
    public StringProperty textProperty(){ return text;}
    public ObjectProperty<Date> timeProperty(){ return time;}

    public User(String nick, String text, Date time){

        this.nick.set(nick);
        this.text.set(text);
        this.time.set(time);
    }
}

Main.java

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());


            ListView<User> listView = new ListView<User>();

            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

            ObservableList<User> users = FXCollections.observableArrayList();
            users.addAll(new User("Bruce", "Is strong", sdf.parse("24/12/1975")),
                    new User("Claire", "Is clever", sdf.parse("02/01/1986")), 
                    new User("Bale", "Is funny", sdf.parse("03/01/1989")));

            listView.setCellFactory(new Callback<ListView<User>, ListCell<User>>() {

                @Override
                public ListCell<User> call(ListView<User> param) {
                    return new ListCell<User>(){

                        @Override
                        protected void updateItem(User item, boolean empty) {

                            super.updateItem(item, empty);
                            if(item != null){

                                HBox mainPane = new HBox();
                                ImageView image = new ImageView(new Image(getClass().getResource("close_icon.png").toExternalForm(),
                                        20, 20, true, true));

                                Label nick = new Label(item.nickProperty().get());
                                Label text = new Label(item.textProperty().get());

                                VBox vBox = new VBox();
                                vBox.getChildren().addAll(nick, text);

                                SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

                                Label time = new Label(dateFormat.format(item.timeProperty().get()));

                                mainPane.getChildren().addAll(image, vBox, time);

                                setGraphic(mainPane);

                            }
                        }

                    };
                }
            });

            listView.setItems(users);

            root.setCenter(listView);


            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

此代码生成以下内容:

我强烈建议您了解如何使用具有 ListView、TableView 等数据模型的 JavaFX 控件。

开始学习的好地方:Using JavaFX UI Controls: ListVew