Вот еще один, который опирается на gcc тип расширения :
#define ARRAYSIZE(arr) ({typeof (arr) arr ## _is_a_pointer __attribute__((unused)) = {}; \
sizeof(arr) / sizeof(arr[0]);})
Это работает, пытаясь настроить идентичный объект и инициализировать это с назначенным массивом инициализатором. Если массив передан, компилятор счастлив. Если указатель передан, компилятор жалуется на:
arraysize.c: In function 'main':
arraysize.c:11: error: array index in non-array initializer
arraysize.c:11: error: (near initialization for 'p_is_a_pointer')
Не используйте компоненты AWT в приложении Swing.
Компоненты Swing начинаются с «J» (JTextField, JPanel и т. Д.).
Не используйте пустой макет. Swing был разработан для использования с менеджерами верстки. Во-первых, панель прокрутки не будет работать должным образом, если панель, добавленная в область просмотра, не использует менеджер макетов.
При динамическом добавлении компонентов на панель базовая логика выглядит следующим образом:
panel.add(...);
panel.revalidate();
panel.repaint();
Синхронизированный блок не требуется. Качели компонентов должны быть обновлены из Event Dispatch Thread (EDT)
. Если ваш код не выполняется на EDT
, вам нужно использовать SwingUtilities.invokeLater(...)
, чтобы поместить код на EDT
. Прочитайте раздел из учебника по Swing на Concurrency для получения дополнительной информации.