Многоразовые константы для макетов FXML? - PullRequest
0 голосов
/ 06 июля 2018

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

Вот причина, по которой:

  • Я обнаружил, что с помощью FXMLLoader.namespace сопоставленные значения доступны только для макета (файла FXML), который загружается в FXMLLoader. Это не соответствовало желанию иметь повторно используемые константы для других файлов FXML.
  • Кроме того, поскольку эти константы определены в коде Java, IDE считает ошибку при использовании, поскольку они не определены непосредственно в файле FXML, что затем затрудняет поиск других исключительные ошибки.

Итак, вопрос в том, как сделать константы для повторного использования для макетов FXML?

Как и в Android, Цветовой ресурс , например:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="white">#FFFFFF</color>
</resources>

Может применяться к атрибуту макета XML:

android:textColor="@color/white"

Есть ли другой возможный способ в JavaFX? Спасибо за все ответы.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

Это довольно просто, мы можем определить метод получения для каждого константного поля, в этом случае мы можем легко получить доступ к их значению из FXML, используя Expression Binding . Вот пример:

Theme.class

package styles;

import javafx.scene.paint.Color;

public final class Theme {

  /** Constant field; use Theme.BASE_COLOR */
  public static final Color BASE_COLOR = Color.TEAL;

  /** Getter method for FXML; use ${theme.baseColor} */
  public Color getBaseColor() { return BASE_COLOR; }
}

layout.fxml

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

<?import javafx.scene.layout.HBox?>
<?import javafx.scene.text.Text?>

<HBox xmlns="http://javafx.com/javafx"
      xmlns:fx="http://javafx.com/fxml"
      alignment="CENTER">

  <fx:define>
    <!--
        Define a reference to our Theme class.
        This is convenient because we only need a single
        instance of our Theme class for every FXML file.
    -->
    <styles.Theme fx:id="theme"/>
  </fx:define>

  <children>
    <!-- Now, we can simply use an expression binding here -->
    <Text text="Hello, World!" fill="${theme.baseColor}"/>
  </children>

</HBox>
0 голосов
/ 06 июля 2018

Наиболее близким является CSS через таблицу стилей.

Constants.css

* {
    -my-color: #FFFFFF;
    -my-width: 300;
    -my-height: 400;
}

Тогда вы можете использовать это где угодно через CSS. Плохая новость - вы должны добавить это Constants.css во все места, где вам нужно это применить.

В коде:

pane.setStyle("-fx-background-color: -my-color;");

В FXML:

<Pane style="-fx-background-color: -my-color;" .... />

В другом конкретном файле CSS:

.my-pane {
    -fx-background-color: -my-color;
}
...