当前位置: 首页 > 知识库问答 >
问题:

JavaFX:在ListView中显示图像而不破坏选择模型

东郭昌胤
2023-03-14

我想显示一个包含文本和图像的列表。我能够做到这一点,但选择模型很时髦。当我用鼠标选择列表中的项目时,似乎选择了整个列表视图元素。当我使用箭头键时,选择模型工作正常。

在我的控制器中,我有可观察列表

public class Game {
    private String name;
    private Image image;
}

在搜索如何显示图像和名称的解决方案时,我发现了许多使用setCellFactory方法的堆栈溢出解决方案,如下面的代码片段所示:

listView.setCellFactory(param -> new ListCell<>() {
            private final ImageView imageView = new ImageView();
            @Override
            public void updateItem(String item, boolean empty) {
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    imageView.setImage(/*Some image*/);
                    setText(game.getName());
                    setGraphic(imageView);
                }
            }
        });

然而,我想显示的图像存储在我的ObservableList中的Game对象中。根据我的理解,上面的String项参数是Game objectstoString方法,但我想在制作自定义ListCell时访问整个Game对象。我试图改变该解决方案,以访问整个Game对象。这就是我的代码当前的样子:

public class MyController implements Initializable {
    @FXML
    public ListView<Game> listView;

    public ObservableList<Game> gameList;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        gameList = FXCollections.observableList(/*List of games*/);
        listView.setItems(gameList);
        listView.setCellFactory(param -> new ListCell<>() {
            private final ImageView imageView = new ImageView();
            @Override
            public void updateItem(Game game, boolean empty) {
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    imageView.setImage(game.getImage());
                    setText(game.getName());
                    setGraphic(imageView);
                }
            }
        });
    }
}

但是,我可以使用箭头键来选择列表中我想要的任何项目。当我这样做时,从我的观察列表中选择的游戏被返回。

有人知道我该如何解决这个问题吗?


共有1个答案

容学林
2023-03-14

默认的ListCell.updateItem(…)方法处理选择等。所以你一定要打电话给它。

从留档:

Cell的子类正确覆盖updateItem方法非常重要...请注意该代码示例中的两个要点:

  1. 我们称之为super.updateItem(T,布尔)方法。如果不这样做,则无法正确设置项和空属性,并且您最终可能会遇到图形问题。

所以你需要:

listView.setCellFactory(param -> new ListCell<>() {
    private final ImageView imageView = new ImageView();
    @Override
    public void updateItem(Game game, boolean empty) {

       // call default implementation:
       super.updateItem(item, empty);

       if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            imageView.setImage(game.getImage());
            setText(game.getName());
            setGraphic(imageView);
        }
    }
});
 类似资料:
  • 我想在JavaFX的ImageView中显示图像。图像应该从SQLite数据库中获取,并在场景加载时显示。我使用以下代码片段从数据库获取代码,并在之前创建的ImageView中显示它。但是图像没有按预期显示。我做错了吗?P. S.我测试了改变路径在两个和当读取文件从目录到。但似乎没有什么奏效。但是当我手动将一个图像文件放在src目录中并尝试读取它时,它就像一个魅力。但是我想展示一张从数据库中提取的

  • 它应该显示一个与掷骰子一致的图像,但什么也没有发生。有问题的图像在包中(如果有关系,请单击并拖入项目窗口)。我在system.out.print中添加了t,以便显示Dice1和2的结果,这样我就知道这是有效的。 我还需要添加一些东西来使它看起来像吗?我以前从未在JavaFX中使用过实际的图像....总的来说,我对JavaFX是新手。 GetChildren c:\users\ethan c.b的错

  • 我一直在研究如何使用HTML5

  • 问题内容: 我需要在手机中打开我的画廊,然后选择一张在活动中在imageview中打开的图片..没什么困难..但是我在模拟器(genymotion)中有完美的代码和thise代码可以运行..但是在小米Mi4上却没有。 打开画廊选择项目,什么也没有。 我没有更多的电话了:( 我尝试下载一些与此主题相关的示例,并且每个示例都是相同的。 您是否有一些从图库中选择图像并在imageview中显示的项目?如

  • 问题内容: 是否有将图像添加到JavaFX ListView的方法? 这是我当前设置列表视图项的方式。 我还使用列表视图值作为ID来知道选择了哪个。 问题答案: 实现显示图片的,并在上设置。该标准的Oracle教程有一个自定义列表单元实现的一个例子。 您将按照以下方式进行操作: 该方法可以经常调用,因此最好预加载图像并将其提供给单元使用,而不是每次调用都创建它们。

  • 我一直试图使用FXML在JavaFX应用程序中显示我的图像,但没有成功。我的代码: 没有错误,但我的图像没有显示。我想图像已加载,但未显示。 这可能吗?我怎么查?如果是的话,不应该有一个错误给它吗? 事实上,即使我给出了一个不正确的名称,也没有运行时错误。也许没上子弹? 我也试过加载不同的图像和改变尺寸,没有任何效果。 ->运行时错误#1 ->林特错误+运行时错误#1 ->林特错误+运行时错误#1