JavaFX 在列表视图中显示字符串附近的图像[关闭]

2024-03-09

我想在列表视图中的字符串附近显示一条消息我尝试查找它但我不太理解它我从网站上尝试了这个http://docs.oracle.com/javafx/2/ui_controls/list-view.htm http://docs.oracle.com/javafx/2/ui_controls/list-view.htm在示例 11-4 创建单元工厂中,我尝试将其转换为 imageview,它确实有效,但问题是我没有看到字符串,图像不在字符串附近,并且图像太大,应该有一种方法可以调整它的大小有人可以帮我在列表视图中的字符串附近显示图像吗?这是我尝试转换的代码:

Piece 1

static class ColorRectCell extends ListCell<String> {
        Image fileimg = new Image(getClass().getResourceAsStream("file.png"));
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            ImageView rect = new ImageView();
            if (item != null) {
                rect.setImage(fileimg);
                setGraphic(rect);
            }
        }
    }

Piece 2

FileExplorerFormSlaveFileListView.setCellFactory(new Callback<ListView<String>, 
                ListCell<String>>() {

                    public ListCell<String> call(ListView<String> list) {
                        return new ColorRectCell();
                    }
                }
            );

我希望有人能帮助我,这对我来说非常重要。谢谢。如果您无法理解我在问什么,请告诉我,我会尝试格式化问题,我不擅长解释问题。


Cells https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ListCell.html are Labeled https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Labeled.html可以固有地显示文本和图形的节点,其中文本是任意图形节点的标签。因此,在您的单元格中,维护图形(ImageView)的渲染,并在更新项目 https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Cell.html#updateItem-T-boolean-执行。

private ImageView imageView = new ImageView();

@Override
protected void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);

    if (empty || item == null) {
        imageView.setImage(null);

        setGraphic(null);
        setText(null);
    } else {
        imageView.setImage(
                imageCollection.get(
                        item
                )
        );

        setText(constructLabel(SHORT_PREFIX, item, SUFFIX));
        setGraphic(imageView);
    }
}

申请样本

在这里,所有可能的图像都被预先加载并存储在缓存中,如果图像数量较少,这将可以正常工作。如果您有大量图像,您可能需要更复杂的 LRU 样式缓存,以便在后台按需加载较新的图像,在后台加载过程运行时可能会为图像提供占位符或进度指示器。

在示例应用程序中,图像在 Image 构造函数中调整大小,以便它们具有相同的高度。此外,该实现适合文件类型图标显示,因为对于任何给定文件类型只会创建单个图像,并且可以通过不同单元格中使用的不同 ImageView 重用该相同图像。

import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Map;
import java.util.stream.Collectors;

public class LabeledList extends Application {

    private static final double IMAGE_HEIGHT = 36;

    private static final String SHORT_PREFIX =
            "bird";

    private static final String LONG_PREFIX =
            "http://icons.iconarchive.com/icons/jozef89/origami-birds/72/" + SHORT_PREFIX;

    private static final String SUFFIX =
            "-icon.png";

    private static final ObservableList<String> birds = FXCollections.unmodifiableObservableList(
            FXCollections.observableArrayList(
                "-black",
                "-blue",
                "-red",
                "-red-2",
                "-yellow",
                "s-green",
                "s-green-2"
            )
    );

    private Map<String, Image> imageCollection;

    @Override
    public void start(Stage stage) throws Exception {
        imageCollection = birds.stream().collect(
                Collectors.toMap(
                        bird -> bird,
                        bird -> new Image(
                                        constructLabel(LONG_PREFIX, bird, SUFFIX),
                                        0,
                                        IMAGE_HEIGHT,
                                        true,
                                        true
                                )
                )
        );

        ListView<String> birdList = new ListView<>(birds);
        birdList.setCellFactory(param -> new BirdCell());
        birdList.setPrefWidth(230);
        birdList.setPrefHeight(200);

        VBox layout = new VBox(birdList);
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }

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

    private class BirdCell extends ListCell<String> {
        private ImageView imageView = new ImageView();

        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            if (empty || item == null) {
                imageView.setImage(null);

                setGraphic(null);
                setText(null);
            } else {
                imageView.setImage(
                        imageCollection.get(
                                item
                        )
                );

                setText(constructLabel(SHORT_PREFIX, item, SUFFIX));
                setGraphic(imageView);
            }
        }
    }

    private String constructLabel(String prefix, String bird, String suffix) {
        return (prefix != null ? prefix : "")
                + bird
                + (suffix != null ? suffix : "");
    }

    // Iconset Homepage: http://jozef89.deviantart.com/art/Origami-Birds-400642253
    // License: CC Attribution-Noncommercial-No Derivate 3.0
    // Commercial usage: Not allowed    

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 在列表视图中显示字符串附近的图像[关闭] 的相关文章

随机推荐

  • sql连接.open()异常

    我是 net 的新手 我正在开发 Windows 窗体应用程序 我正在尝试将我的应用程序连接到基于 Visual Studio 服务的数据库 我只是在提交按钮后面编写代码 private void button1 Click object
  • 如何将小部件(例如 QPushButton)动态添加到设计器内置的布局中

    我正在玩Qt 主要是想为symbian重写一个旧的java应用程序 但我自己有点困惑 我首先要说明的是 C 不是我的功夫 这可能就是问题的根源 我想做的是将一个简单的 QPushButton 添加到主窗口中的垂直布局 该窗口已在运行时在 q
  • Ruby:“意外的keyword_end”...但所有的开头和结尾都匹配

    我正在编写一段代码 它将向用户返回第 n 个素数 我在第 19 行和第 22 行收到 unexpected keywords end 语法错误 我在代码中添加了注释 以便您可以轻松找到错误的位置 def nthPrime n number
  • 如何将所有子域请求重定向到 htaccess 中的主域?

    我需要重定向所有子域请求以重定向到我的 htaccess 中的主域 我需要它还包括某种通配符重定向 例如Washington mysite com 重定向至 mysite com washington 但我还需要将子域上的任何旧网址重定向到
  • Play Framework 2.5 模块的依赖项注入

    我有一个具有以下签名的模块类 class SilhouetteModule extends AbstractModule with ScalaModule 我想注入配置 class SilhouetteModule Inject confi
  • 空白导致 div 在纯 CSS 中堆叠[重复]

    这个问题在这里已经有答案了 我正在使用纯 CSS 来布局网站 但遇到了问题 如果嵌套网格元素之间存在任何空格 则会破坏布局并将最后一个 div 推到下一行 我创建了一个测试网站 内容尽可能少 以测试是否只有我一个人这样做 但我仍然遇到了问题
  • 类签名中的“()V”是什么意思?

    我用 Javassist 创建了一个构造函数 它没有真正的方法 CtConstructor c CtNewConstructor make argTypes null newClass 当我试图发出这个班级的签名时 c getSignatu
  • 了解包含多个Content-Type标头的curl POST请求命令

    以下卷曲命令 curl v F json method update video params video id 582984001 itemState INACTIVE token jCoXH5OAMYQtXm1sg62KAF3ysG90
  • 检测登录页面中的表单身份验证超时

    当您将表单身份验证设置为在访问受保护页面时重定向到 login aspx 时 有什么好方法可以在 login aspx 中检测用户是否因为尚未登录而被发送到那里 或者因为他们的表单身份验证票证已存在已到期 我想显示 您已超时 消息 在这个问
  • 表单未提交到数据库[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 因此 当我在表单上输入信息后 它会使用新表单刷新 new php 页面 但不会提交任何信息 我没有收到任何错误 就像我在页面上单击
  • Python 中频谱图的 FFT

    我将如何使用 Python 从 WAV PCM 文件读取频率峰值 然后能够生成它的图像以进行频谱图分析 我正在尝试制作一个程序 允许您读取任何音频文件 将其转换为 WAV PCM 然后找到峰值和截止频率 Python 波库 http doc
  • Eclipse 注释/取消注释快捷方式?

    我认为这很容易实现 但到目前为止我还没有找到评论 取消评论快捷方式的解决方案Java class editor and jsf faceted webapp XHTML file editor to quickly comment unco
  • Node.JS 中的 createReadStream

    所以我使用了 fs readFile 它给了我 致命错误 CALL AND RETRY LAST 分配失败 进程超出 记忆 由于 fs readFile 在调用回调之前将整个文件加载到内存中 我应该使用 fs createReadStrea
  • CSS 过渡在悬停时闪烁

    太棒了 你用宝贵的时间阅读我的问题 我正在尝试在悬停时翻转 div 一切都很顺利 但在转换过程中它会闪烁 看起来几乎像是翻转了多次 这破坏了翻转的整体效果 下面是我的代码和小提琴 小提琴 FIDDLE http jsfiddle net h
  • WinRT 应用程序中的 app.config 相当于什么?

    在 Windows 桌面开发 WinForms WPF 中 app config是放置应用程序中使用的连接字符串或 uri 等内容的潜在位置 这允许最终用户在应用程序范围内更改这些设置 而无需开发人员重新构建和重新部署 WinRT应用程序中
  • Intellij / Android Studio 可以折叠注释吗?

    我在intellij中注释掉了这段代码 如您所见 此处无法折叠评论 然而 Webstorm 中相同的注释块可能会被折叠 有没有办法在intellij Android Studio中配置注释折叠 折叠任意选定的块 在编辑器中选择连续的代码片段
  • Django CSRF 框架有很多失败

    我的站点上的 CSRF Django 中间件 来自 SVN trunk 的版本 出现了很多失败 我得到的唯一错误是 CSRF 失败 原因 CSRF 令牌丢失或不正确 我如何诊断这些 CSRF 错误来自何处 我自己无法导致 CSRF 错误 但
  • 验证错误:向后分支上存在未初始化的对象/JVM 规范 4.10.2.4

    The JVM 规范 4 10 2 4 版本 7 最后一段 http docs oracle com javase specs jvms se7 html jvms 4 html jvms 4 10 2 4 says 如果未初始化对象的特殊
  • 更改 EditText setError 可绘制重力

    对于将要填充 RTL 文本的 EditText 有没有办法改变错误可绘制对象 当然还有弹出窗口 的重力 这是一个常规错误可绘制的示例 因此 由于输入的文本是 RTL 我希望弹出窗口显示在 EditText 的左侧 我尝试应用自定义绘图 但是
  • JavaFX 在列表视图中显示字符串附近的图像[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想在列表视图中的字符串附近显示一条消息我尝试查找它但我不太理解它我从网站上尝试了这个http docs oracle com javafx