Похоже, вы пытаетесь ввести TextField
в статическое поле. Что-то вроде
@FXML
private static TextField myTextField ;
Это, по-видимому, работало в JavaFX 2.2. Он не работает в JavaFX 8. Поскольку ни одна официальная документация никогда не поддерживала это использование, это на самом деле не нарушает обратную совместимость, хотя, с полным основанием, документация о том, что делает FXMLLoader
, довольно горькая.
На самом деле не имеет смысла делать статические поля @FXML
-injected. Когда вы загружаете файл FXML, он создает новые объекты для каждого из элементов в файле FXML. Новый экземпляр контроллера связан с каждым вызовом FXMLLoader.load(...)
, а поля в экземпляре этого контроллера вводятся соответствующими объектами, созданными для элементов FXML. Таким образом, введенные поля обязательно специфичны для экземпляра контроллера. Если у вас были статические введенные поля в контроллере, и вы дважды загрузили один и тот же файл FXML и дважды отображали его в пользовательском интерфейсе, тогда у вас не было бы способа ссылаться на оба набора элементов управления.
Обновление: ответ на вопрос в комментариях
В частности, не используйте статические поля, чтобы они могли быть доступны извне класса. Статическое поле имеет одно значение, принадлежащее классу, вместо значения для каждого экземпляра класса, и решение о создании полей static должно выполняться только в том случае, если это имеет смысл. Другими словами, static
определяет область scope , а не доступность . Чтобы разрешить доступ к данным экземпляра, вам просто нужно иметь ссылку на экземпляр. FXMLLoader
имеет метод getController()
, который позволяет вам получить ссылку на контроллер.
Связанная точка: также не рекомендуется отображать элементы управления пользовательского интерфейса от контроллера. Вместо этого вы должны предоставить данные. Например, вместо определения метода getTextField()
в контроллере вместо этого определите метод textProperty()
, который возвращает StringProperty
, представляющий содержимое TextField
. Причина этого в том, что, когда ваш босс приходит в офис и говорит вам, что он хочет заменить TextField
на TextArea
или ComboBox
или на какой-то другой элемент управления, тогда это будет намного сложнее если классы вне контроллера используют ваш TextField
. Структура данных, представленных вашим контроллером, гораздо реже изменяется, чем реализация того, как эти данные представляются пользователю.
Для некоторых примеров
Ну, вам нужно получить доступ к параметру agent1 X1. Было бы полезно, если бы вы поделились некоторыми скриншотами и реальными именами объектов, но в вашей нотации вам понадобится что-то вроде этого, при условии, что у вас есть популяция агентов, встроенная в main, где живут все агенты (и предположим, что агенты 1 и 2 - это один и тот же агент тип), и при условии, что мы сделаем обновление агента 2, это X
X = X + main.myAgentPopulation.get(0).Y
Также предполагается, что «агент 1» - самый первый агент в вашем населении.
Лучше всего, если вы либо поделитесь некоторыми подробностями или лучше узнаете ООП на основе Java (вы не находитесь в мире наук о массивах, тензорах и матрицах :-)).
веселит
Надеюсь, я понимаю ваш вопрос:
Во-первых, чтобы отправить сообщение от одного агента другому, вы можете использовать функцию отправки. Если ваше сообщение отправляется от агента1 к агенту2, чтобы отправить X, вы будете использовать: send (X, agent2)
Во-вторых, в соединениях с вашим агентом вы будете определять сообщения как int и в полученном вами сообщении. можно сделать Y=Y+msg;
Обратите внимание, что msg - это X, полученный от агента 1.
РЕДАКТИРОВАТЬ: отправленное сообщение можно прочитать только в элементе соединений, как я уже говорил ... в вашем случае, когда вы используете переменную-посредник при переходе, вы используете переменную-посредник агента, а не ту, которая было отправлено. Единственный способ сделать это так, как я только что показал вам.