Почему я не могу отобразить ярлык под изображением (javafx)? - PullRequest
0 голосов
/ 07 мая 2019

Итак, у меня есть стек-панель.Его высота установлена ​​на 300. Внутри области стека находится изображение, содержащее изображение и метку.Я установил высоту изображения на 250 и выравнивание по центру.Я установил выравнивание метки по центру нижней части панели.и все же каждый раз, когда я запускаю код, изображение помещается в нижнюю часть фрейма, а текст метки находится сверху, поэтому его трудно читать.Не имеет значения, если высота области стека равна 500, для изображения установлено 100 Pos.TOP-CENTER, а метка находится по центру базовой линии, текст не будет отображаться под изображением, как это должно быть.вместо этого он отображается в нижней части изображения.может кто-нибудь сказать мне, почему это происходит?

public class VBoxProductPane extends StackPane {

    private MainController mainController;
    private String name;
    private Image image;
    private String fileName;
    private double price;
    private int quantity;
    private Button button = new Button();
    private Product product;

    public VBoxProductPane(Product product){

        setPrefSize(250, 275);
        this.name = product.getName();
        this.price = product.getPrice();
        this.quantity = product.getQuantity();
        this.fileName = product.getFileName();
        this.product = new Product(this.name, this.price, this.quantity, this.fileName);
        setImage();
        setButton();
        setLabel();
        setOnMouseEntered(e -> {
                    button.setVisible(true);
                });
        setOnMouseExited(e -> {
            button.setVisible(false);
        });
    }
    private void setButton(){
        button.setText("Explore");
        getChildren().add(button);
        button.setVisible(false);
        button.setOnAction(e -> {
            button.setVisible(true);
        });
        button.setOnAction(e -> {
            try {
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(getClass().getResource("/ProductLayout.fxml"));
                Stage secondaryStage = new Stage();
                loader.setController(new ProductPage(mainController, product));
                secondaryStage.setTitle(product.getName());
                secondaryStage.setHeight(450);
                secondaryStage.setWidth(600);

                Scene scene = new Scene(loader.load());
                secondaryStage.setScene(scene);
                secondaryStage.show();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });
    }
    private void setLabel(){
        Label label = new Label(getLabelText());
        setAlignment(label, Pos.BOTTOM_CENTER);
// this does nothing
        label.setLayoutY(250);
        label.setWrapText(true);
        label.setTextAlignment(TextAlignment.CENTER);
        getChildren().add(label);
        setAlignment(label, Pos.BOTTOM_CENTER);
    }
    private String getLabelText(){
        if (this.product.getName() == null){
            System.out.println("name is null");
        }
        return this.product.getName();
    }
    private Image getImage(){
        Image image = this.product.getImage();
        return image;
    }
    private void setImage() {
        ImageView imageViews = new ImageView();
        imageViews.setImage(this.product.getImage());
        setAlignment(imageViews, Pos.TOP_CENTER);
// this does nothing
        imageViews.setFitHeight(150);
// does not matter what this height is set to
// image is always displayed at the bottom with text over top
        imageViews.setFitWidth(250);
        imageViews.setY(0);
        getChildren().add(imageViews);
    }
}

1 Ответ

1 голос
/ 07 мая 2019

ImageView - это очень простой тип Node.Это не изменяемого размера (у него нет значений min / max / pref).Это делает его (к сожалению) действительно неудобным для использования в макетах.

Например, StackPane не может принять правильное решение о том, что делать с ImageView (поскольку у него нет предпочтительного размера или даже максимального размера), и просто назначает ему столько местанасколько это возможно.

Что вы можете сделать, чтобы решить эту проблему:

1) Заверните ImageView в контейнер и установите его размеры (установив максимальные размеры, совпадающие с размерами посадки).должно работать).

2) Используйте VBox или BorderPane, чтобы вы могли правильно разместить Label внизу.

3) Используйте setGraphic из Labelдля прямой интеграции Image с элементом управления Label.

...