【问题标题】:JavaFx : How to put ImageView inside ListViewJavaFx:如何将 ImageView 放入 ListView
【发布时间】:2016-02-09 02:32:59
【问题描述】:

我一直在搜索有关 JavaFx ListView 的一些主题,但仍然很难找到一个简单而简单的解决方案来将 JavaFx ImageView 放入 JavaFx ListView。我正在尝试使用 JavaFx 框架创建一个聊天应用程序。在照片上它应该看起来像那样。这不是重复的,因为其他线程对于像我这样的初学者来说是模糊的。 ListView with imageview inside

我尝试过这样的事情。我完全不知道这个提前谢谢!

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {
     ImageView imageView = new ImageView();
     Image image = new Image(Main.class.getResourceAsStream("bell.jpg"));
    ListView<String> list = new ListView<String>();
    ObservableList<String> data = FXCollections.observableArrayList(
            "chocolate", "salmon", "gold", "coral", "darkorchid",
            "darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue",
            "blueviolet", "brown");
   Image pic;

    @Override
    public void start(Stage stage) {
        VBox box = new VBox();
        Scene scene = new Scene(box, 200, 200);
        stage.setScene(scene);
        stage.setTitle("ListViewSample");
        box.getChildren().addAll(list);
        VBox.setVgrow(list, Priority.ALWAYS);
        list.setItems(data);

        list.setCellFactory(listView -> new ListCell<String>() {
            public void updateItem(String friend, boolean empty) {
                super.updateItem(friend, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {

                    imageView.setImage(image);
                    setText(friend);
                    setGraphic(imageView);
                }
            }

        });

        stage.show();
    }


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

【问题讨论】:

  • 这样就可以了:listCell.setGraphic(row);其中“行”是 HBox 或 GridPane...
  • Image in JavaFX ListView的可能重复

标签: java javafx


【解决方案1】:

您不需要每次想在 ListView 中设置图像时都创建一个新的 HBox。可以直接使用 ListView 的setCellFactory() 来达到同样的效果。

这个例子只是答案Image in JavaFX ListView 的扩展,包含一个Minimal, Complete, and Verifiable example,可以试用和测试。 如果你想了解它是如何工作的,我建议你先看看链接的问题。

更新 - 如何调整图片大小

要调整图像大小以适合您想要的大小,请使用 ImageView 的 fitWidth()fitHeight() 方法。还有其他方法,例如 setSmooth()setPreserveRatio() 也可以派上用场。

MCVE

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ListViewWithImages extends Application {

    private final Image IMAGE_RUBY  = new Image("https://upload.wikimedia.org/wikipedia/commons/f/f1/Ruby_logo_64x64.png");
    private final Image IMAGE_APPLE  = new Image("http://findicons.com/files/icons/832/social_and_web/64/apple.png");
    private final Image IMAGE_VISTA  = new Image("http://antaki.ca/bloom/img/windows_64x64.png");
    private final Image IMAGE_TWITTER = new Image("http://files.softicons.com/download/social-media-icons/fresh-social-media-icons-by-creative-nerds/png/64x64/twitter-bird.png");

    private Image[] listOfImages = {IMAGE_RUBY, IMAGE_APPLE, IMAGE_VISTA, IMAGE_TWITTER};

    @Override
    public void start(Stage primaryStage) throws Exception {

        ListView<String> listView = new ListView<String>();
        ObservableList<String> items =FXCollections.observableArrayList (
                "RUBY", "APPLE", "VISTA", "TWITTER");
        listView.setItems(items);

        listView.setCellFactory(param -> new ListCell<String>() {
            private ImageView imageView = new ImageView();
            @Override
            public void updateItem(String name, boolean empty) {
                super.updateItem(name, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    if(name.equals("RUBY"))
                        imageView.setImage(listOfImages[0]);
                    else if(name.equals("APPLE"))
                        imageView.setImage(listOfImages[1]);
                    else if(name.equals("VISTA"))
                        imageView.setImage(listOfImages[2]);
                    else if(name.equals("TWITTER"))
                        imageView.setImage(listOfImages[3]);
                    setText(name);
                    setGraphic(imageView);
                }
            }
        });
        VBox box = new VBox(listView);
        box.setAlignment(Pos.CENTER);
        Scene scene = new Scene(box, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

输出

【讨论】:

  • 非常感谢,这正是我所需要的。我需要学习如何去做,然后用我正在工作的当前项目来实施它。感谢在这里帮助我的人,希望你们继续在这里帮助其他人!
  • 嗯,我想知道当我将图像更改为类似这样的图像时,我正在将图像加载到我的机器上,而不是在网络上。 Image image = new Image(Main.class.getResourceAsStream("bell.jpg")) ;图像尺寸真的很大,我想知道如何将其缩小。
  • 你可以把它留给ImageView。在 ImageView 上使用 fitWidth()fitHeight()。还有其他方法如setSmooth()setPreserveRatio() 可以帮助您。
  • @JustineMackay 您可以从任何您喜欢的地方加载图像。我使用了网络链接,因为它们可以在任何机器上复制和试用,而如果我使用机器本地的链接,您将必须更改代码才能看到它的实际效果:)
  • setFitHeight 和 setFitWidth 就像一个魅力!再次感谢!
【解决方案2】:

除了我的评论,我将在这里展示一些对我有用的代码:

private void setListEntry(ListCell<Label> listCell, Label label) {

        Image img = loadLableIcon(label);

        GridPane row = new GridPane();
        row.setHgap(15);
        row.setVgap(15);

        ColumnConstraints col1 = new ColumnConstraints();
        col1.setPercentWidth(90);
        ColumnConstraints col2 = new ColumnConstraints();
        col2.setPercentWidth(10);

        ImageView icon = new ImageView(img);

        javafx.scene.control.Label name = new javafx.scene.control.Label(label.getName());
        name.setMinWidth(120d);

        javafx.scene.control.Label amount = new javafx.scene.control.Label("" + label.getSize());

        HBox iconAndName = new HBox(10);
        iconAndName.setAlignment(Pos.CENTER_LEFT);
        iconAndName.getChildren().addAll(icon, name);

        row.add(iconAndName, 0, 0);
        row.add(amount, 1, 0);

        row.getColumnConstraints().addAll(col1, col2);

        listCell.setGraphic(row);
    }

请注意:我不是 JavaFX 方面的专家,所以我不确定这是否是最佳实践。

【讨论】:

  • 感谢您的帮助!我也不是 JavaFx 方面的专家,但我正在尝试通过编程来提高自己。你能用整个代码更新你上面的代码吗?我不知道如何用新代码来实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多