Джава. Качели. Изменение порядка компонента в контейнере - PullRequest
1 голос
/ 21 ноября 2011

Я использую Java Swing.Я создал JPanel и заполнил его компонентами.

JPanel panel = new JPanel();
for (JComponent c : components) {
   panel.add(c);
}

Мне нужно изменить порядок некоторых компонентов.Для определенности мне нужно поменять местами два компонента с определенными индексами (oldIndex и newIndex).Я знаю, что могу получить все компоненты через panel.getComponents ().

Я нашел только один способ сделать это.

Component[] components = panel.getComponents();
panel.removeAll();
components[oldIndex] = targetComponent;
components[newIndex] = transferComponent;
for (Component comp : components) {
    panel.add(comp);
}                
panel.validate();

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

Ответы [ 4 ]

4 голосов
/ 21 ноября 2011

Проблема в вашем вопросе состоит в том, что мы не знаем, кто такие targetComponent и TransferComponent , и вы можете создать новые компоненты. Вы можете попробовать это:

Component[] components = panel.getComponents();
panel.removeAll();
Component temp = components[oldIndex];
components[oldIndex] = components[newIndex];
components[newIndex] = temp;
for (Component comp : components) {
    panel.add(comp);
}                
panel.validate();
1 голос
/ 21 ноября 2011

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

0 голосов
/ 27 февраля 2012
int oldIndex = -1;
// old list holder
ArrayList<Component> allComponents = new ArrayList<Component>();
int idx = 0;
for (Component comp : panel.getComponents()) {
  allComponents.add(comp);
  if (comp==com) {
    oldIndex = idx;
  }
  idx++;
}

panel.removeAll();

// this is a TRICK !
if (oldIndex>=0) {
  Component temp = allComponents.get(oldIndex);
  allComponents.remove(oldIndex);
  allComponents.add(newIndex, temp);
}

for (int i = 0; i < allComponents.size(); i++) 
  panel.add(allComponents.get(i));

panel.validate();
0 голосов
/ 21 ноября 2011

Попробуйте CardLayout .Это позволяет переключение компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...