我做了一个ListView<ImageView>
一些图像
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Orientation;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
public class MyApp extends Application {
@Override
public void start(Stage stage) throws Exception {
Image img = new Image("main/img.png");
ObservableList<ImageView> list = FXCollections.observableArrayList();
for (int i = 0; i < 4; i++) {
ImageView iView = new ImageView(img);
list.add(iView);
}
ListView<ImageView> listView = new ListView<>(list);
listView.setOrientation(Orientation.HORIZONTAL);
Group root = new Group(listView);
Scene scene = new Scene(root, 500, 500);
stage.setScene(scene);
stage.sizeToScene();
stage.show();
}
public static void main(String[] args) throws Exception {
launch(args);
}
}
但这就是它的样子
我希望图像完全覆盖每个单元格 - 没有插图,没有填充,没有滚动条。它们之间只是一个边界。
我想绑定(bind)heightProperty
ListView ,但它是只读的。 ImageView 也没有大小属性,但我认为是单元格占用了空间,而不是 ImageView 。
我还尝试添加 Pane
像这样:
Image img = new Image("main/img.png");
ObservableList<Pane> list = FXCollections.observableArrayList();
for (int i = 0; i < 4; i++) {
ImageView iView = new ImageView(img);
Pane pane = new BorderPane(iView);
pane.setStyle("-fx-background-color: yellow;");
list.add(pane);
}
ListView<Pane> listView = new ListView<>(list);
listView.setOrientation(Orientation.HORIZONTAL);
给出了这个结果
还有渲染器
list.setCellFactory((ListView<ImageView> l) -> new FitCell());
但你也不能绑定(bind)单元格的属性。在不手动设置高度和宽度的情况下如何做到这一点?
最佳答案
听起来您根本不需要 ListView
。将 ImageView
放入 HBox
中,并将 HBox
包装在 ScrollPane
中。您可以使滚动 Pane 可平移并根据需要设置滚动条策略。这使您可以完全控制布局等,而不必担心虚拟化单元的复杂性。
例如
HBox hbox = new HBox();
Image img = new Image("main/img.png");
for (int i = 0; i < 4; i++) {
ImageView iView = new ImageView(img);
Pane pane = new StackPane(iView);
pane.setStyle("-fx-background-color: yellow;");
hbox.getChildren().add(pane);
}
ScrollPane scroller = new ScrollPane(hbox);
scroller.setPannable(true);
scroller.setFitToHeight(true);
scroller.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
Group root = new Group(scroller);
// ...
您可能需要在 Pane 上设置其他样式,例如填充和边框等,但这应该足以让你得到你想要的。
关于java - 如何使 ListView<ImageView> 不占用超出其需要的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141337/