我正在使用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();
但在我看来,组件正在被重新创建,因为它们会在这些操作之前松散一些处理程序(侦听器)。 您能否建议另一种方法来重新排序容器中的组件?
答案 0 :(得分:4)
您的问题中的问题是我们不知道 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 :(得分:1)
如果您不希望激活层次结构事件和其他事件,我认为唯一的选择是自定义布局管理器。
答案 2 :(得分:0)
试试CardLayout。它允许组件切换。
答案 3 :(得分:-1)
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();