JavaFX: как дать более одного круга одного и того же размера? - PullRequest
0 голосов
/ 05 ноября 2018

мой вопрос кажется простым, но я пока не нашел хорошего пути. Я хочу иметь несколько кругов, определенных в моем FXML, 10 кругов должны иметь радиус 10px, 20 других должны иметь один из 6px. Я хочу объявить размер в одной точке, чтобы я мог легко его изменить.

Я не выяснил, можно ли / как объявить переменную в FXML, что будет самым простым способом. Поэтому я надеялся, что CSS поможет мне, что было бы еще приятнее: я попытался дать кругу два styleClass и установить размер для них в CSS, но кажется, что нет свойства для масштабирования круга.

<Circle fx:id="c00" centerX="100" centerY="100" styleClass="circle10" /> 

Еще одна мысль заключалась в переопределении класса Circle и установке радиуса на требуемое значение. Но я не думаю, что это чистый код, потому что макет должен быть сделан на FXML и CSS, а не на Java.

В этом месте должен быть способ сделать это, не связываясь с кодом Java.

Заранее спасибо за любую помощь! mismyl

1 Ответ

0 голосов
/ 05 ноября 2018

В FXML, если вы хотите определить одну переменную, которую можно использовать в нескольких местах, используйте fx:define. От Введение в FXML :

Элемент <fx:define> используется для создания объектов, которые существуют за пределами иерархии объектов, но, возможно, потребуется обратиться к ним в другом месте.

Например, при работе с переключателями обычно определяется ToggleGroup, который будет управлять состоянием выбора кнопок. Эта группа не является частью самого графа сцены, поэтому не должна добавляться к родительскому элементу кнопок. Блок определения можно использовать для создания группы кнопок, не влияя на общую структуру документа:

<VBox>
    <fx:define>
        <ToggleGroup fx:id="myToggleGroup"/>
    </fx:define>
    <children>
        <RadioButton text="A" toggleGroup="$myToggleGroup"/>
        <RadioButton text="B" toggleGroup="$myToggleGroup"/>
        <RadioButton text="C" toggleGroup="$myToggleGroup"/>
    </children> 
</VBox>

Элементам в определяющих блоках обычно присваивается идентификатор, который можно использовать для ссылки на значение элемента позже. Идентификаторы более подробно обсуждаются в следующих разделах.

А вот пример для определения радиуса Circle:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.Double?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>

<VBox xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" spacing="10.0" alignment="CENTER">

    <padding>
        <Insets topRightBottomLeft="10.0"/>
    </padding>

    <fx:define>
        <Double fx:id="smallRadius" fx:value="50.0"/>
        <Double fx:id="largeRadius" fx:value="100.0"/>
    </fx:define>

    <Circle radius="$smallRadius"/>
    <Circle radius="$largeRadius"/>
    <Circle radius="$smallRadius"/>
    <Circle radius="$largeRadius"/>

</VBox>
...