Java revalidate (); перемещает объекты, которые были перемещены, обратно в исходное местоположение - PullRequest
0 голосов
/ 15 мая 2018

Я делаю приложение, в котором JLabels созданы и могут быть перемещены с помощью

.setLocation(x,y)

Однако всякий раз, когда я призываю

.setVisible(true)

JLabels возвращаются в исходное положение. Я думаю, что это как-то связано с

.setVisible() s --- revalidate() функция

Но я не уверен, как переопределить или избежать revalidate() эффектов.

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

Прочтите учебник Swing на Менеджеры макетов для получения дополнительной информации и рабочих примеров.

JLabels создаются и могут быть перемещены с помощью setLocation (x, y)

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

Однако я бы порекомендовал вам взглянуть на Drag Layout .Это менеджер компоновки, который реализует большинство функций диспетчера компоновки, но позволит вам контролировать расположение компонента.

Однако всякий раз, когда я вызываю setVisible (true)

Кроме того, компоненты Swing видимы по умолчанию, поэтому нет необходимости вызывать этот метод, кроме как для контейнеров верхнего уровня (JFrame, JDialog и т. Д.).

0 голосов
/ 15 мая 2018

Вы не переопределяете или не изменяете revalidate() - скорее вы используете соответствующий менеджер макета, поскольку все, что нужно сделать для повторной проверки, - это сказать менеджерам компоновки компоновку компонентов, содержащихся в этом и во всех вложенных контейнерах. Одним из «решений» является использование макета null, но я настоятельно не рекомендую это делать, так как это приведет к трудностям при отладке и поддержке графического интерфейса, которые могут хорошо выглядеть на одной платформе и ужасно на всех остальных. Рассмотрите возможность вложения JPanels, каждый из которых использует свой собственный менеджер макетов и использует Borders, например EmptyBorder, для достижения желаемого макета GUI.

...