JAVA摆动更换部件';我们在集装箱里订的

JAVA摆动更换部件';我们在集装箱里订的,java,swing,containers,Java,Swing,Containers,我正在使用JavaSwing。我已经创建了JPanel并用组件填充它 JPanel panel = new JPanel(); for (JComponent c : components) { panel.add(c); } 我需要更改一些组件的顺序。为了确定起见,我需要用已定义的索引(oldIndex和newIndex)交换其中两个组件。 我知道,我可以通过panel.getComponents()获得所有组件 我只找到了一种方法 Component[] components = p

我正在使用JavaSwing。我已经创建了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();
但在我看来,组件正在被重新创建,因为它们在进行此类操作之前失去了一些处理程序(侦听器)。
您能建议另一种方法来重新订购容器中的组件吗?

您的问题是我们不知道谁是targetComponenttransferComponent,您可能会创建新组件。您可以尝试以下方法:

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();

您的问题是,我们不知道谁是targetComponenttransferComponent,您可能创建了新的组件。您可以尝试以下方法:

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();

试试看。它允许组件切换。

试试看。它允许组件切换。

如果您不想触发层次结构事件和其他事件,我认为唯一的选项是自定义布局管理器。

如果您不想触发层次结构事件和其他事件,我认为唯一的选项是自定义布局管理器。

int oldIndex=-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();
//旧名单持有人 ArrayList allComponents=新的ArrayList(); int-idx=0; 对于(组件组件:panel.getComponents()){ 所有组件。添加(组件); if(comp==com){ oldIndex=idx; } idx++; } panel.removeAll(); //这是个骗局! 如果(旧索引>=0){ 组件温度=所有组件。获取(旧索引); 所有组件。删除(旧索引); 添加所有组件(新索引、温度); } 对于(int i=0;i
intoldinex=-1;
//旧名单持有人
ArrayList allComponents=新的ArrayList();
int-idx=0;
对于(组件组件:panel.getComponents()){
所有组件。添加(组件);
if(comp==com){
oldIndex=idx;
}
idx++;
}
panel.removeAll();
//这是个骗局!
如果(旧索引>=0){
组件温度=所有组件。获取(旧索引);
所有组件。删除(旧索引);
添加所有组件(新索引、温度);
}
对于(int i=0;i
我只能在CardLayout中看到“选择要显示的内容”逻辑。我不知道如何在我的情况下使用它。我已经有了一个工作组件,但这个重新排序的问题仍然没有得到正确的解决。我只能在CardLayout中看到“选择要显示的内容”逻辑。我不知道如何在我的情况下使用它。我已经有了工作组件,但是这个重新排序的问题仍然没有得到正确的解决。关键是我想要它们。但在重新排序后,这两个组件将丢失它们。诀窍是我想要它们。但是,在重新订购后,这两个组件将丢失。是的,你是对的。现在可以了。多谢。知道这是相当愚蠢的路障=)对象是这样获得的:JImageButton targetBtn=(JImageButton)container.getComponentAt(dtde.getLocation());Transferable tr=dtde.getTransferable();JImageButton transferBtn=(JImageButton)tr.getTransferData(JImageButtonTransferable.DEFAULT\u JImageButton\u FLAVOR);是的,你说得对。现在可以了。多谢。知道这是相当愚蠢的路障=)对象是这样获得的:JImageButton targetBtn=(JImageButton)container.getComponentAt(dtde.getLocation());Transferable tr=dtde.getTransferable();JImageButton transferBtn=(JImageButton)tr.getTransferData(JImageButtonTransferable.DEFAULT\u JImageButton\u FLAVOR);afaics,这不能解决需求(交换两个组件)。afaics,这不能解决需求(交换两个组件)。