Ошибка при разрешении ошибки onAction либо обработчик события не находится в пространстве имен, либо в скрипте [duplicate]

  1. Используя функцию merge, мы можем выбрать переменную левой таблицы или правой таблицы, так же, как мы все знакомы с оператором select в SQL (EX: выберите a. * ... или выберите b. * из .....)
  2. Мы должны добавить дополнительный код, который будет подмножаться из недавно объединенной таблицы. SQL: - select a.* from df1 a inner join df2 b on a.CustomerId=b.CustomerId R: - merge(df1, df2, by.x = "CustomerId", by.y = "CustomerId")[,names(df1)]

То же самое

  • SQL: - select b.* from df1 a inner join df2 b on a.CustomerId=b.CustomerId
  • R: - merge(df1, df2, by.x = "CustomerId", by.y = "CustomerId")[,names(df2)]
13
задан jewelsea 24 April 2014 в 09:12
поделиться

1 ответ

Похоже, вы пытаетесь ввести 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<String> или на какой-то другой элемент управления, тогда это будет намного сложнее если классы вне контроллера используют ваш TextField. Структура данных, представленных вашим контроллером, гораздо реже изменяется, чем реализация того, как эти данные представляются пользователю.

Для некоторых примеров

31
ответ дан James_D 21 August 2018 в 23:43
поделиться
  • 1
    Спасибо, Джеймс. Есть ли в любом случае доступ к содержимому компонента из других классов контроллера? Например, у меня есть некоторый контент (флажки и таблицы), отображаемые в спискеView в одном классе контроллера. Если я хочу получить доступ к нему из другого класса контроллера без изменения или изменения его содержимого, как мне это сделать? – Christopher_Daniel 17 April 2014 в 11:38
  • 2
    +1 за хорошее объяснение. В этих ситуациях я всегда думал, что статичность имеет смысл. Вы все равно можете использовать статику еще 8b109 . Речь идет о 5-м вопросе, который я видел на этом до сих пор, но никогда не объяснял «почему не статичный». – brian 17 April 2014 в 15:31
Другие вопросы по тегам:

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