Перемещение фигур во встроенных панелях JavaFX [дубликат]

Отсутствует «extern» в объявлениях / определениях переменной 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

6
задан jewelsea 14 January 2014 в 23:31
поделиться

2 ответа

Предлагаемый подход

Для вашего конкретного фрагмента кода лучше всего использовать Pane вместо StackPane .

Почему ваш код не делает то, что вы хотите

Если вы собираетесь вручную устанавливать значения макета, не используйте панель макета (например, StackPane), которая автоматически устанавливает для вас значения макета. Если вы используете панель макета, то значения макета, которые вы явно задали, будут автоматически переопределены, в следующий раз панель макета выполнит пропуск макета (например, он будет изменен, или какой-либо его контент или местоположение в графе сцены станет грязным).

Опции для явной укладки узлов

Если вы хотите явно разместить элементы в JavaFX, выполните одно из следующих действий:

  1. Подкласс Регион и переопределить layoutChildren .
  2. Поместить свой контент на панель , если вам нужно, чтобы контейнер был стилизован с помощью CSS или реализовал функции изменения размера.
  3. Поместите свой контент в группу , если вам не нужен контейнер для стилизации с помощью CSS или реализация функций изменения размера.

Связанные рекомендации по позиционированию узлов

Если вы хотите автоматически выложить компоненты с помощью предопределенных менеджеров макетов, но вы хотите отрегулировать или временно изменить расположение некоторых компонентов по умолчанию, вы можете настроить t он переводит значения X / Y, а не значения layoutX / Y. В соответствии с определением translateX :

Окончательный перевод узла будет вычисляться как layoutX + translateX, где layoutX устанавливает устойчивую позицию узла, а translateX дополнительно выполняет динамические настройки это положение. Эта переменная может использоваться для изменения местоположения узла, не нарушая его layoutBounds, что делает его полезным для анимации местоположения узла.

Это означает, что диспетчер компоновки может вычислять позицию по умолчанию для ребенка используя layoutX, и вы можете отрегулировать позицию по умолчанию, используя translateX.

15
ответ дан jewelsea 27 August 2018 в 10:27
поделиться

Не имея глубокого изучения текущего случая, я вижу разницу, когда я использую AnchorPane вместо StackPane, чтобы включить кнопку.

Изменив текст меток Button при помощи мыши, мы отобразим панель (запрограммировано макет). С помощью StackPane, размещающего все его дети в самом центре, позиция Button сбрасывается в центр панели. Когда вы посмотрите на метод layoutChildren из StackPane, вы увидите вызов resizeRelocate. Поэтому layoutX и layoutY сбрасываются, и кнопка возвращается в центральное положение (или независимо от того, для чего вы устанавливаете выравнивание StackPane).

Поэтому я считаю, что это правильное поведение StackPane, и я рекомендую используйте другую панель, например AnchorPane.

0
ответ дан Rupert 27 August 2018 в 10:27
поделиться
Другие вопросы по тегам:

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