gpt4 book ai didi

java - 如何将图像添加到 ListView

转载 作者:行者123 更新时间:2023-12-02 00:57:17 27 4
gpt4 key购买 nike

过去 8 小时我一直在阅读文档,但没有发现任何可以帮助我的内容。隐约是的,但是没有代码在工作,因为它一直说“找不到图像网址”并抛出异常。不过我还有其他项目,从来没有遇到过这个问题。

所以,有一个类包含这样的月份:

public enum Month{JAN(1, "img.png",...DEC(12, "img.png");
private final int monthValue;
private final String imgName;

private Month(int monthValue, String imgName){
this.monthValue = monthValue;
this.imgName = imgName;
}

public int getMonth(){
return monthValue;
}

public String getImage(){
return imgName;}
}

到目前为止,一切都很好。我什至可以在控制台中测试它并且工作正常并且还按值排序。现在,当我尝试从资源添加图像时,出现了我之前提到的问题:找不到 url。但是,我可以使用来自“C:\...\resources\monthImg.png”的路径来制作只有 1 个图像值的 ImageView,但我与其他人一起工作,每次我在线发送它时,他都必须更改图像目录也是如此。需要很多时间。

现在,我一直在尝试获取 12 个图像并将它们设置为主项目类中的此枚举。这样我就可以分配给节点并使用 GUI。

我的方法是遵循这个线程:JavaFx : How to put ImageView inside ListView但是,它使用 setCellFactory ,我很确定您可以在没有该方法和更少的代码行的情况下完成此操作。

我有两个名为“main”的包(其中包含主类和月份类及其构造函数和方法),以及一个在不同文件夹中也称为“main”的资源包(其中包含所有图像)。请记住,如果我使用 C:\中的整个完整路径,它就可以工作,但我也希望在项目本身中启动它以将其发送给我的 friend 。

如何才能像上面链接中的示例一样,在 VBox 内的后代值中获取这些带有值堆栈的图像?

注意:该项目的目的是使这些图像看起来像一个日历,堆放着拖放选项(我知道这样做)。谢谢。

最佳答案

尝试将问题分成更小的部分,一步一步地解决。
您可以首先让 ListView 显示您想要的图像。使用热链接图像使代码更像 mre并使帮助和测试变得简单高效:

import java.util.stream.Stream;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.TilePane;
import javafx.stage.Stage;

public class FxMain extends Application {

@Override
public void start(Stage primaryStage) {

MonthListCell[] listCell = Stream.of(Month.values()).map(MonthListCell::new).toArray(MonthListCell[]::new);
ObservableList<MonthListCell> items =FXCollections.observableArrayList (listCell);
ListView<MonthListCell> listView = new ListView<>(items);
primaryStage.setScene(new Scene(listView));
primaryStage.sizeToScene();
primaryStage.show();
}

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

enum Month{

JAN(1,"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/64x64/Circle_Green.png"),
FEB(2,"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/64x64/Circle_Red.png"),
MAR(3,"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/64x64/Circle_Yellow.png"),
APR(4,"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/64x64/Circle_Blue.png"),
MAY(5,"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/64x64/Circle_Orange.png"),
JUN(6,"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/64x64/Circle_Grey.png");

private final int monthValue;
private final String imgName;

private Month(int monthValue, String imgName){
this.monthValue = monthValue;
this.imgName = imgName;
}

public int getMonth(){
return monthValue;
}

public String getImage(){
return imgName;
}
}

class MonthListCell extends ListCell<Month> {

private final ImageView imageView;
private final Label text;

MonthListCell(Month month) {
Image image = new Image(month.getImage());
imageView = new ImageView(image);
//use label for text instead of setText() for better layout control
text = new Label(month.name());
TilePane node = new TilePane(Orientation.VERTICAL, 5, 0, imageView, text);
setGraphic(node);
}

@Override
public void updateItem(Month month, boolean empty) {
super.updateItem(month, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
imageView.setImage(new Image(month.getImage()));
text.setText(month.name());
}
}
}

接下来尝试使用本地资源(图像)而不是链接的资源。

关于java - 如何将图像添加到 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61199559/

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