Это в нашей природе, даже самым бесконечным образом, оставить свой след в этом мире, прежде чем мы покинем его. Я хотел бы добавить следующий термин, ранее не встречавшийся в пространстве JavaFX, и представить его как мой скромный вклад в человеческий коллектив:
bindstorm \ ‘bïnd • storm \ (существительное): условие, при котором множество пересчетов связывания JavaFX сильно снижают производительность интерактивной работы.
Да, я знаю, что использовать слово, которое вы хотите определить внутри его определения, плохо, но для этого есть прецедент: (1) Необычные, изящные, словесные словари колледжа делают это все время. (2) Математики и компьютерные ученые называют эту рекурсию : таинственная концепция, которую разработчики используют, чтобы впечатлить других от их мастерства программирования.
Не поймите меня неправильно, привязка JavaFX невероятно мощная. Черт возьми, мы посвятили ему целую главу в нашей книге « JavaFX: разработка многофункциональных интернет-приложений» . Но привязка имеет свою цену, и, как и большинство других вещей, чрезмерное потребление может привести к злоупотреблениям.
Рассмотрим этот вариант использования: у вас есть приложение JavaFX с десятками или, может быть, даже сотнями узлов, которые являются частью графа сцены. Каждый из узлов в конечном итоге имеет размеры и расположение пропорционально переменным экземпляра высоты и ширины , которые передаются вниз. Если вы определяете ширину и высоту при запуске и не интересуетесь интерфейсом с изменяемыми размерами, у вас есть все шансы избежать использования многих привязок.выражения. Единственный потенциальный поворот здесь заключается в том, что если вы искренне заинтересованы в приложении без возможности изменения размера, но хотите, чтобы оно занимало весь экран, что вы делаете? Поскольку экраны бывают разных форм и размеров, вы можете не знать, какое разрешение имеет время запуска. JavaFX имеет элегантное решение для этого, которое использует привязку .
Вот простое приложение, которое определяет прямоугольник и круг, которые заполняют весь экран. Вы можете щелкнуть в любом месте круга, чтобы выйти из приложения. Обратите внимание на количество привязок, необходимое для работы.
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.scene.input.*;
function run() : Void {
var stage: Stage = Stage {
fullScreen: true
scene: Scene {
content: [
Rectangle {
width: bind stage.width
height: bind stage.height
fill: Color.BLUE
}
Circle {
centerX: bind stage.width / 2
centerY: bind stage.height / 2
radius: bind if (stage.width < stage.height) then
stage.width / 2 else stage.height / 2
fill: Color.RED
onMouseClicked: function(me: MouseEvent) {
FX.exit();
}
}
]
}
}
}
Представьте, как бы это выглядело, если бы у вас было много сложных пользовательских компонентов с гораздо большим количеством зависимостей от высоты и ширины . В дополнение к потенциальному влиянию на производительность, это может быть подвержено ошибкам и обременительно для кода. Чтобы избежать чрезмерного использования привязки и потенциального связывания , приложения такого рода можно переписать следующим образом:
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.scene.input.*;
function run() : Void {
var AWTtoolkit = java.awt.Toolkit.getDefaultToolkit ();
var screenSizeFromAWT = AWTtoolkit.getScreenSize ();
Stage {
fullScreen: true
scene: Scene {
content: [
Rectangle {
width: screenSizeFromAWT.width
height: screenSizeFromAWT.height
fill: Color.BLUE
}
Circle {
centerX: screenSizeFromAWT.width / 2
centerY: screenSizeFromAWT.height / 2
radius: if (screenSizeFromAWT.width <
screenSizeFromAWT.height) then
screenSizeFromAWT.width / 2
else screenSizeFromAWT.height / 2
fill: Color.RED
onMouseClicked: function(me: MouseEvent) {
FX.exit();
}
}
]
}
}
}
Мы достигаем того же эффекта, что и в первом примере, сначала вызывая метод в пакете java.awt.Toolkit . С помощью этой информации мы можем статически определить наш сценограф без использования привязки.
Есть одно предупреждение для этого решения. Поскольку AWT (Advanced Windowing Toolkit) является неотъемлемой частью Java SE, этот код должен быть переносимым на все рабочие столы JavaFX. Однако, если вы хотите развернуть решение JavaFX Mobile, вызовы AWT могут измениться. Есть ли механизм, который может работать в обеих моделях?
В заключение, пока мы находимся на этой теме придумывания терминов, мои товарищи Джим Кларк и Эрик Бруно , соавторы вышеупомянутой книги JavaFX , в шутку спросили, какое слово можно использовать для описания этого сценария:
«Условие, при котором привязки приводят к привязкам, которые приводят к исходной привязке и заканчиваются ошибкой стека?»
BindQuake? BindTsunami? Bindless? BindSpin? BindHole (Черная дыра)? BindPit?