const
(только для C ++) Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const
имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern
(т.е. когда отсутствует ключевое слово static
).
Пример:
// file1.cpp
const int test = 5; // in C++ same as "static const int test = 5"
int test2 = 5;
// file2.cpp
extern const int test;
extern int test2;
void foo()
{
int x = test; // linker error in C++ , no error in C
int y = test2; // no problem
}
correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp
extern const int test;
extern int test2;
. В качестве альтернативы можно было бы объявить переменную const
в файле file1.cpp с явным extern
Предлагаемый подход
Для вашего конкретного фрагмента кода лучше всего использовать Pane вместо StackPane .
Почему ваш код не делает то, что вы хотите
Если вы собираетесь вручную устанавливать значения макета, не используйте панель макета (например, StackPane), которая автоматически устанавливает для вас значения макета. Если вы используете панель макета, то значения макета, которые вы явно задали, будут автоматически переопределены, в следующий раз панель макета выполнит пропуск макета (например, он будет изменен, или какой-либо его контент или местоположение в графе сцены станет грязным).
Опции для явной укладки узлов
Если вы хотите явно разместить элементы в JavaFX, выполните одно из следующих действий:
Связанные рекомендации по позиционированию узлов
Если вы хотите автоматически выложить компоненты с помощью предопределенных менеджеров макетов, но вы хотите отрегулировать или временно изменить расположение некоторых компонентов по умолчанию, вы можете настроить t он переводит значения X / Y, а не значения layoutX / Y. В соответствии с определением translateX :
Окончательный перевод узла будет вычисляться как layoutX + translateX, где layoutX устанавливает устойчивую позицию узла, а translateX дополнительно выполняет динамические настройки это положение. Эта переменная может использоваться для изменения местоположения узла, не нарушая его layoutBounds, что делает его полезным для анимации местоположения узла.
blockquote>Это означает, что диспетчер компоновки может вычислять позицию по умолчанию для ребенка используя
layoutX
, и вы можете отрегулировать позицию по умолчанию, используяtranslateX
.
Не имея глубокого изучения текущего случая, я вижу разницу, когда я использую AnchorPane вместо StackPane, чтобы включить кнопку.
Изменив текст меток Button при помощи мыши, мы отобразим панель (запрограммировано макет). С помощью StackPane, размещающего все его дети в самом центре, позиция Button сбрасывается в центр панели. Когда вы посмотрите на метод layoutChildren из StackPane, вы увидите вызов resizeRelocate. Поэтому layoutX и layoutY сбрасываются, и кнопка возвращается в центральное положение (или независимо от того, для чего вы устанавливаете выравнивание StackPane).
Поэтому я считаю, что это правильное поведение StackPane, и я рекомендую используйте другую панель, например AnchorPane.