JavaFX Autosizing два или более VBoxes бок о бок в HBox [дубликат]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

8
задан ril3y 23 March 2012 в 03:12
поделиться

3 ответа

Я не уверен, что ты сможешь. Вам нужно использовать компонент макета GridPane. В этом компоненте вы можете указать ограничения строк и столбцов, и в этих ограничениях вы можете указать ширину в процентах. Например:

<GridPane>
    <children>
        <TitledPane text="testGridPane" GridPane.columnIndex="0" GridPane.rowIndex="0" />
    </children>
    <columnConstraints>
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="80.0" prefWidth="100.0" />
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" prefWidth="100.0" />
    </columnConstraints>
    <rowConstraints>
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    </rowConstraints>
</GridPane>

Этот код определяет GridPane с первым столбцом шириной 80%. TitledPane устанавливается в первой ячейке первого столбца этого GridPane и может (потому что вы должны быть уверены, что ограничения ширины TitledPane соответствуют вашим потребностям) занимают 80% от ширины GridPane.

Обратите внимание, что я удалил всю информацию, не относящуюся к вашему вопросу. Кстати, инструмент Oracle Scene Builder очень полезен для определения сложного макета FXML.

18
ответ дан Xetnus 26 August 2018 в 17:44
поделиться

Кажется, что многие ответы уже предоставлены, и они должны работать. Тем не менее, есть способ установить проценты:

<fx:define>
    <Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>

Это поможет вам определить размеры текущего экрана, приложение отображается. Теперь, когда у нас есть размеры дисплея, мы можем играть с ним в FXML следующим образом:

<HBox fx:id="hroot" prefHeight="${screen.visualBounds.height}" prefWidth="${screen.visualBounds.width}"> Your FXML elements inside the root... </HBox>

Обратите внимание, что я использую visualBounds, так как это обеспечит мне доступное пространство на экране, t требуется перекрытие с панелью задач в Windows, например. Для полноэкранных приложений вы просто используете «границы».

Теперь, чтобы приблизиться к процентам, вы можете играть со значением prefheight и prefWidth. Вы можете поместить вычисления внутри $ {}.

Необязательно:

Если вы хотите, чтобы все ваши элементы использовали относительные размеры, просто обратитесь к ним, используя свой идентификатор, свойство ширины или высоты и сделайте свой расчет.

<VBox fx:id="VBSidebar" prefWidth="${hroot.width*0.15}" prefHeight="${hroot.height}"> more elements.. </VBox>

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

6
ответ дан Jarrick 26 August 2018 в 17:44
поделиться

Вы можете имитировать его - базовый пример, который имитирует 50% для двух столбцов в HBox. Вы можете добавить фиктивные панели для получения третей и т. Д.

    HBox {
        VBox {
            static hgrow : "ALWAYS",
            Label {
                text : "Privacy",
                alignment : "CENTER",
                styleClass : ["h2", "heading"]
            }
        },
        VBox {
            static hgrow : "ALWAYS",
            Label {
                text : "Messages",
                alignment : "CENTER",
                styleClass : ["h2", "heading"]
            },
            Label {text:""}
        }
    }
0
ответ дан Tim Beres 26 August 2018 в 17:44
поделиться
Другие вопросы по тегам:

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