Как добавить изображения в ListView - PullRequest
0 голосов
/ 14 апреля 2020

Последние 8 часов я читал документы и не нашел ничего, что могло бы мне помочь. Смутно да, но никакой код не работает, потому что он продолжает говорить «URL изображения не найден» и выдает исключение. Однако у меня есть другие проекты, и у меня никогда не было этой проблемы.

Итак, есть один класс, который содержит месяцы примерно так:

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 не найден. Тем не менее, я могу сделать ImageView только с одним значением изображения, используя путь из "C: \ ... \ resources \ monthImg.png", но я работаю с другим человеком, и каждый раз, когда я отправляю его онлайн, он должен также измените каталог изображений. Занимает много времени.

Теперь я пытался получить 12 изображений и установить их в этом перечислении в основном классе проекта. Поэтому я могу назначить узлы и работать GUI.

Мой подход заключался в следующем: JavaFx: Как поместить ImageView в ListView Однако он использует setCellFactory что я почти уверен, что вы можете сделать это без этого метода и без строк кода.

У меня есть два пакета с именем "main" (который содержит основной класс и класс month с его конструкторами и методами) и пакет ресурсов, также называемый «основным» в другой папке (которая содержит все изображения). Помните, что это работает, если я использую весь полный путь от C: \, но я также хотел бы, чтобы он был запущен в самом проекте, чтобы отправить его моему другу.

Каков будет подход подхода таким образом, я могу получить эти изображения со стеком значений друг с другом в значениях-потомках внутри VBox, как в примере выше по ссылке?

Примечание. Проект состоит в том, чтобы сделать эти изображения похожими на календарь, сложенный с помощью опции перетаскивания (что я знаю, чтобы сделать). Спасибо.

1 Ответ

2 голосов
/ 14 апреля 2020

Постарайтесь решить проблемы небольшими порциями, шаг за шагом. Вы можете начать с просмотра списка отображения изображений, которые вы хотите. Использование горячих связанных изображений делает код более 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());
        }
    }
}

Далее попробуйте использовать локальные ресурсы (изображения) вместо связанных ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...