Есть ли способ вставить «ячейку» в MigLayout? - PullRequest
4 голосов
/ 22 ноября 2010

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

Например, если у меня есть следующий макет (строки представляют ячейки MigLayout):

+----+----+----+  
| X1 | X2 | X3 |
+----+----+----+----+
| Y1 | Y2 | Y3 | Y4 |
+----+----+----+----+

Можно ли создать ячейку между строкамиX и Y, чтобы получить:

+----+----+----+  
| X1 | X2 | X3 |
+----+----+----+
| Z1 |
+----+----+----+----+
| Y1 | Y2 | Y3 | Y4 |
+----+----+----+----+

Я пытался content.add(component, "cell 1 0, wrap");, но он вставляет компонент в ячейку Y1.

Единственное решение, которое у меня есть, это вызвать content.add(component, "wrap", index);.Однако для этого необходимо знать общее количество предыдущих компонентов.

Ответы [ 5 ]

2 голосов
/ 17 февраля 2011

Ограничение «Hidemode» поможет вам:

new MigLayout("hidemode 3","","[][][]")
1 голос
/ 02 февраля 2011

Вместо использования концепции «ячейка» вы можете использовать «абсолютное» позиционирование для ваших ячеек в migLayout и склеивать ячейки вместе, ссылаясь на координаты соседних ячеек.Вам нужно дать имена своим ячейкам, чтобы ссылаться на них в migLayout.

Затем вы можете изменить расположение ячеек в любое время, изменив ссылки на имена в координатах ячеек, вам просто нужноЧтобы вызвать setComponentConstraints (...) для затронутых ячеек.

Если вы вставляете ячейку Z, вы

См. демонстрационное приложение miglayout.некоторый код может выглядеть следующим образом:

myPanel.add(createCell("X1"), "pos 0 0 100 100");
myPanel.add(createCell("X2"), "pos X1.x2 0 200 X1.y2");

и т. д.

Когда вы вставляете ячейку "Z",

myPanel.add(createCell("Z"), "pos 0 X1.z2 200 100");

вам нужно только изменить ссылку yY1 от X1.y2 до Z.y2.

Я сделал что-то.похоже на создание мультисплитпэна, и, похоже, хорошо работает.

1 голос
/ 15 января 2011

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

  Map<Component,Object> constraintMap = migLayout.getConstraintMap();
  Component[] allComps = jPanel.getComponents();
  jPanel.removeAll();
  for (Component c : allComps) {
    if ( condition_to_insert ) {
      jPanel.add(insertComponent, new CC());
    } 
    jPanel.add(c, constraintMap.get(c));

  }
  migLayout.invalidateLayout(jPanel);
0 голосов
/ 15 декабря 2010

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

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

0 голосов
/ 26 ноября 2010

Я не уверен, что это лучшее решение, но вы можете снова переместить весь контейнер, включая ваш новый компонент.Я не думаю, что есть способ вставить компоненты так, как вы хотите.

надеюсь, я ошибаюсь.

но это не должно быть слишком накладным, и это произойдетбыстро, чтобы пользователь заметил!

...