JavaFx ImageView подходит ячейке GridView [дубликат]

@Hank Gay

В ответ на комментарий EmbiggensTheMind:

Я не могу придумать экземпляр, где currying - сам по себе - полезен в JavaScript; это метод преобразования вызовов функций с несколькими аргументами в цепочки вызовов функций с одним аргументом для каждого вызова, но JavaScript поддерживает несколько аргументов в одном вызове функции.

В JavaScript - и я предполагаю, что большинство других реальных языков (не лямбда-исчисление) - это обычно связано с частичным применением. John Resig объясняет это лучше , но суть в том, что у них есть некоторая логика, которая будет применяться к двум или более аргументам, и вы знаете только значения для некоторых из этих аргументов.

Вы можете использовать частичное приложение / каррирование, чтобы исправить эти известные значения и вернуть функцию, которая принимает только неизвестные, которые будут вызываться позже, когда у вас действительно есть значения, которые вы хотите передать. Это обеспечивает отличный способ избежать повторения себя, когда вы бы снова и снова вводили одни и те же встроенные модули JavaScript со всеми одинаковыми значениями, кроме одного. Чтобы украсть пример Джона:

String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( (results[1] == "Resig") + " The text values were split properly" );

2
задан jcespinoza 15 December 2012 в 04:52
поделиться

2 ответа

Это может иметь две причины.

1) вы, возможно, не определили ограничения строк и столбцов для вашей сетки. Даже когда GridPane растет, его ячейки не обязательно выйдут за пределы их предпочтительного размера. Лучший способ достичь этого - определить ограничения с процентной шириной / высотой, например:

public class ImageGrid extends Application {
    @Override
    public void start(final Stage stage) throws Exception {
        final GridPane pane = new GridPane();
        for (int i = 0; i < 10; i++) {
            final ImageView imageView = new ImageView(new Image("..."));
            pane.getChildren().add(imageView);
            GridPane.setConstraints(imageView, i%5, i/5);
        }

        pane.getColumnConstraints().addAll(
             columnWithPercentage(20),
             columnWithPercentage(20),
             columnWithPercentage(20),
             columnWithPercentage(20),
             columnWithPercentage(20)
        );

        pane.getRowConstraints().addAll(
                rowWithPercentage(50),
                rowWithPercentage(50)
        );

        final Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.setWidth(800);
        stage.setHeight(600);
        stage.show();
    }

    private ColumnConstraints columnWithPercentage(final double percentage) {
        final ColumnConstraints constraints = new ColumnConstraints();
        constraints.setPercentWidth(percentage);
        return constraints;
    }

    private RowConstraints rowWithPercentage(final double percentage) {
        final RowConstraints constraints = new RowConstraints();
        constraints.setPercentHeight(percentage);
        return constraints;
    }
    public static void main(String[] args) {
        Application.launch(args);
    }
}

Это создаст сетку 5x2 из ImageView, которая заполнит все пространство сетки

2) Решение выше вырастет ваши изображения, но сам класс ImageView не растянет изображение за пределами его обычного размера, пока не будет сказано. Вероятно, вам придется привязать ImageView#fitWidthProperty и ImageView#fitHeightProperty, если вы хотите, чтобы изображения расширялись, когда сетка расширяется.

3
ответ дан sarcan 23 August 2018 в 19:12
поделиться

Я новичок в JavaFX, и у меня была аналогичная проблема. У меня была AnchorPane, которая содержала BorderPane. Центр BorderPane содержал GridPane (gridPaneMaze). Этот gridPaneMaze использовал изображения ImageView [7] [7] для заполнения каждой ячейки моей сетки квадратным .png-файлом.

Я хотел, чтобы мои изображения изменялись с высотой окна. Поскольку я использовал квадраты, ширина столбца должна меняться автоматически.

Сначала, когда я изменил размер моего окна, мои столбцы были более широкими, чем мои изображения, а высота изображений была большой для строк.

После проб и ошибок я обнаружил, что это сделало трюк:

ИЗОБРАЖЕНИЯ У меня был сквозной ход между строками и столбцами, и в каждой ячейке я установил Imageview с соответствующим изображением (который всегда является квадратом) и использовал эту привязку высоты (я разделил высоту сетки на количество строк):

images[i][j].fitHeightProperty().bind(gridPaneMaze.heightProperty().divide(7));
images[i][j].setPreserveRatio(true);

Предполагаю, вы также можете использовать widthProperty и делить на Число столбцов. Но поскольку большинство мониторов имеют меньшую высоту, чем ширину, я использовал высоту.

GRIDPANE:

Я создал свою gridPane с помощью FXML, но это не имеет никакого значения для значений.

<BorderPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<center>
    <GridPane fx:id="gridPaneMaze" centerShape="false" minHeight="0.0" minWidth="0.0"   BorderPane.alignment="TOP_LEFT">
        <columnConstraints>
            <ColumnConstraints halignment="CENTER" />
            <ColumnConstraints halignment="CENTER" />
            <ColumnConstraints halignment="CENTER" />
            <ColumnConstraints halignment="CENTER" />
            <ColumnConstraints halignment="CENTER" />
            <ColumnConstraints halignment="CENTER" />
            <ColumnConstraints halignment="CENTER" />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints valignment="CENTER" />
            <RowConstraints valignment="CENTER" />
            <RowConstraints valignment="CENTER" />
            <RowConstraints valignment="CENTER" />
            <RowConstraints valignment="CENTER" />
            <RowConstraints valignment="CENTER" />
            <RowConstraints valignment="CENTER" />
        </rowConstraints>
        <children>
            //...
        </children>
        <BorderPane.margin>
            <Insets left="10.0" top="10.0" />
        </BorderPane.margin>
    </GridPane>
</center>

BORDERPANE: Я добавил пограничную рамку к своей привязке, поэтому я установил все якоря в «0».

GRIDPANE: имел minWidth 0 и minHeight 0. Я не устанавливал prefWidth, prefHeight, maxWidth или maxHeight.

ROWS: Я установил ничего, кроме вертикального выравнивания по центру (нет minHeight, prefHeight maxHeight )

COLUMNS: Я устанавливаю только горизонтальное выравнивание по центру (нет minWidth, prefWidth maxWidth)

Надеюсь, это поможет ...

2
ответ дан 9duust 23 August 2018 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: