Java Swing getSize () возвращает неточное значение? - PullRequest
6 голосов
/ 03 июня 2011

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

Подробнее: у меня есть диалоговое окно, в котором есть подпанели, растянутые горизонтально по центру.Диалог всегда должен быть таким же широким, как этот список вложенных панелей, и использовать полосу прокрутки, когда список становится слишком длинным.Я попробовал это, просто используя 1 подпанель, хотя для начала.Независимо от того, что я делаю, размер возвращаемой субпанели всегда неверен примерно на 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
}

Ответы [ 2 ]

3 голосов
/ 04 июня 2011

На ум приходят две вещи:

  1. Вы можете использовать validate() до pack(), чтобы установить геометрию подпанелидля дальнейшего использования, как показано в этом примере .

  2. Возможно, вам придется учесть пробелы по умолчанию, указанные в FlowLayout, чтоявляется макетом по умолчанию для JPanel.

2 голосов
/ 03 июня 2011

Вместо этого, вы могли бы pack() окно и затем ограничить размер окна доступными размерами экрана?

...