Как сделать границы компонента swing фиксированными

#java #swing #resize #layout-manager #jcomponent

#java #swing #изменение размера #макет-менеджер #jcomponent

Вопрос:

У меня есть a JPanel , к которому я добавил несколько компонентов (флажок, комбинация и т. Д.). Я заметил, что при максимальном увеличении фрейма границы компонентов также перемещаются или сдвигаются вправо. Затем при восстановлении компоненты возвращаются в исходное положение.

На 21-дюймовом и более дюймовом мониторе сдвиг компонентов действительно имеет значение, поскольку вы можете видеть, что компоненты перемещаются далеко вправо.

Мы используем настраиваемый менеджер компоновки, который реализует java.awt.LayoutManager2 . Содержимое класса очень велико, поэтому будет указывать на области, которые определяют границы для компонентов.

 protected int hMargin = 0;
..
Insets insets = target.getInsets();
Dimension size = target.getSize();

int  x = (size.width - insets.left - insets.right - 15 * hMargin);
  

И из фрейма, который вызывает макет, добавьте компоненты, как показано ниже:

 JPanel  pl = new JPanel(new OurLayout(this))
//add the component to panel
pl.add(checkBox);
..
  

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

Кто-нибудь может предложить какие-либо идеи о том, как этого добиться? пример кода будет оценен по достоинству.

Комментарии:

1. Посмотрите, как это делают другие менеджеры компоновки. Подсказка: они используют getPreferredSize() , getMinimumSize() и getMaximumSize() .

2. почему вы создаете свой собственный LayoutManager? Гибкие, мощные менеджеры сложно реализовать, имеет смысл проверить, соответствует ли вашим требованиям один из трех сторонних менеджеров (MigLayout, FormLayout, DesignGridLayout)

3. Возможно, это не то, что вы хотите услышать, но зачем использовать свой собственный менеджер компоновки, есть ли что-нибудь, что вам нужно, что SpringLayout не может сделать?

4. У нас есть специальные спецификации, о которых заботится пользовательский макет. Ta!

Ответ №1:

Если у вас есть пользовательский менеджер компоновки, то ваш менеджер компоновки должен учитывать предпочтительный размер панели. Проблема в вашем коде управления макетом.

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

Ответ №2:

Благодаря Thomas и camickr за их рекомендации я нашел решение, используя строку синтаксиса ниже.

       size=c.getMinimumSize();
      int dist =(size.width - insets.left - insets.right);
      int move = ((dist > 32) ? 35 : 38);
      x = (dist   move * hMargin);
  

Еще раз спасибо всем за рекомендации.