gpt4 book ai didi

JavaFX 在 ListView 中显示字符串附近的图像

转载 作者:行者123 更新时间:2023-12-01 21:54:47 24 4
gpt4 key购买 nike

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

第 1 block

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);
}
}
}

第 2 部分

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

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

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

最佳答案

CellsLabeled可以固有地显示文本和图形的节点,其中文本是任意图形节点的标签。因此,在您的单元格中,维护图形(ImageView)的渲染,并在 updateItem 中适当设置图形和文本。实现。

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);
}
}

示例应用程序

imageview with labeled image

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

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

}

关于JavaFX 在 ListView 中显示字符串附近的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34535024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com