Это относительно легко узнать, осмотрев FXMLLoader
:
/**
* A key for location URL in namespace map.
* @see #getNamespace()
* @since JavaFX 2.2
*/
public static final String LOCATION_KEY = "location";
/**
* A key for ResourceBundle in namespace map.
* @see #getNamespace()
* @since JavaFX 2.2
*/
public static final String RESOURCES_KEY = "resources";
private URL location;
private ResourceBundle resources;
private <T> T loadImpl(InputStream inputStream,
Class<?> callerClass) throws IOException {
...
namespace.put(LOCATION_KEY, location);
namespace.put(RESOURCES_KEY, resources);
...
}
В основном это означает, что location
(например, resources
, controller
и Controller
) является зарезервированным ключевым словом .
Эти ключевые слова добавляются в namespace
(наблюдаемая карта: ObservableMap<String, Object> namespace
), а location
- это URL-адрес файла FXML, что-то вроде:
namespace.put("location", "file:/path/to/your/FXML/file");
Позже различные теги fx:id
вашего файла FXML оцениваются и добавляются в одно и то же пространство имен:
private void processValue() throws LoadException {
...
if (fx_id != null) {
namespace.put(fx_id, value);
injectFields(fx_id, value);
}
...
}
В этом случае, если ваш fx:id
равен "location"
, вы будете делать что-то вроде:
namespace.put("location", Label@12dafafa);
Очевидно, что поскольку вы используете один и тот же ключ, вы перезаписываете прежний URL-адрес новым объектом, в данном случае меткой.
Позже, когда FXMLLoader пытается внедрить это местоположение:
injectFields(LOCATION_KEY, location);
исключение происходит, поскольку Label
, полученное картой от ключа "location"
, может быть установлено в поле URL:
Can not set javafx.scene.control.Label field org.openjfx.FXMLController.location to java.net.URL
Хотя это не задокументировано, это означает, что вы не можете использовать "location"
(или "resources"
, "controller"
) в качестве значения для тега fx:id
, поскольку он будет конфликтовать с этими ключевыми словами.