Java Swing getSize () возвращает неточное значение?

Проще говоря, я пытаюсь использовать ширину компонента, чтобы установить размер его родительского контейнера. Однако возвращаемая ширина компонента отличается примерно на 4 пикселя.

Подробнее: У меня есть диалог, в котором естьпанели, расположенные горизонтально по его середине. Диалоговое окно всегда должно быть таким же широким, как этот список субпанелей, и использовать полосу прокрутки, когда список становится слишком длинным. Я попробовал использовать только одну подпанель для начала. Независимо от того, что я делаю, размер возвращаемой субпанели всегда неверен примерно на 4 пикселя. Я вижу только очень раздражающий 4-пиксельный зазор справа от моей субпанели, из-за чего мой диалог выглядит ужасно. Эффект, очевидно, усиливается по мере добавления дополнительных субпанелей.

То, что я пытался использовать, чтобы получить ширину:

sup-panel.getSize().width;
sub-panel.getBounds().width;
sub-panel.getWidth();
sub-panel.getPreferredSize().width;

Все возвращают одно и то же неправильное значение.

Другие вещи, которые я пытался вызвать, чтобы заставить его вести себя:

parent.validate();
parent.repaint();
parent.doLayout();

Любая помощь будет оценена. Это намеренно? Мне не хватает какой-то концепции размеров? Это кажется последовательным, но было бы неплохо, если бы я мог где-нибудь прочитать, что это задокументировано.

К вашему сведению: я использую java 1.3 (поддерживающий устаревшее приложение)

ПРИМЕЧАНИЕ: это не проблема с изменением размера окна , эта часть происходит нормально. И размер субпанелей, похоже, установлен правильно, поскольку изменения его размера отражаются в значениях, возвращаемых для моего кода. Просто значения всегда немного отличаются.

ПРИМЕЧАНИЕ 2: вызов pack () в родительском контейнере заставляет окно выглядеть так, как я хочу, но для меня это не будет работать для всех сценариев, потому что в конечном итоге после появления достаточного количества субпанелей полоса прокрутки должна быть. pack () просто сделает мой диалог очень широким в этом случае и сделает полосу прокрутки бесполезной.

РЕДАКТИРОВАТЬ: Я решил свою проблему. К сожалению, все мои субпанели не имели одинаковой ширины, как должно было быть. Есть 2 эффективных решения. Заставьте их все быть единообразными, что может быть непросто, в зависимости от того, насколько вы хороши в макетах. Другой - суммировать индивидуальную ширину первых n панелей, которые я хочу видеть. Обратите внимание: чтобы это решение работало, я должен добавить +1 к ширине каждого подкомпонента. Не уверен, почему, но я тестировал его с различными границами и макетами, и он чрезвычайно согласован; Я предполагаю, что где-то есть пиксель лишнего места, о котором я недостаточно много думаю. Но главное, теперь он работает отлично. Вот пример математических расчетов (извините за нетипизированную коллекцию старой школы, требующую преобразования, Java 1.3):

int width = 0;
for(int i = 0; i < MAX_VISIBLE_PANELS; i++)
{
    width += ((SubPanel)panelList.get(i)).getWidth();
    width ++;//extra pixel per panel
}
6
задан gnomed 7 June 2011 в 20:18
поделиться