После того, как фоновый компонент, т. Е. Все, что находится за вашим меню, рендерится, у него появляется объект Graphics
, который можно использовать для получения метрик для данного шрифта только один раз.
Вы, конечно, не хотите делать это в методе paint
, который должен быть максимально легким. Я бы повесил этот код на слушателя, который вызывается при первой визуализации компонента. Он может хранить получившийся объект FontMetrics где-нибудь, где вы сможете впоследствии получить к нему доступ, либо в методе paint
для отрисовки этих элементов меню.
Вместо того, чтобы определять измерения графики вашего меню в последний момент, т. Е. При paint
использовании, было бы неплохо вместо этого создать некоторые компоненты для представления вашего меню. Вы можете разместить эти компоненты на стеклянной панели подробнее здесь , чтобы они плавали над всем остальным, и у вас будет дополнительный бонус, что все эти компоненты способны принимать щелчки мыши и запускать события слушателя на их, и поскольку они фиксируют события только по своей геометрии, вам даже не нужно выяснять, какая часть меню была нажата при щелчке, если вообще.
Еще одним преимуществом использования компонентов здесь является то, что вы можете полностью обойти требование манипулирования метриками шрифта. Есть готовые пункты меню, или вы можете просто использовать JLabels
, и вы можете указать их выравнивание, вы можете использовать LayoutManager
, чтобы установить размеры ячеек в соответствии с шириной самой большой метки и т. Д.