2013-10-22 104 views
3

我有一个随机顺序填充复合材料的GridLayout。现在,我正在对列表/集合中填充GridLayout的复合材料进行排序,并希望按照列表/集合中的排序结果对它们进行排序。我试图通过将它们再次分配给父母来做到这一点,以便他们按照正确的顺序进行,但由于某种原因没有发生任何事情。然后我尝试将它们缓存在你看不到的Composite中,然后用与第一次尝试相同的方法将它们带回到父项。根本没有改变。任何人都有一个指针?我按日期排序,以防万一/所以想知道。Reorder GridLayout SWT

这就是我的网格看起来像现在我想要像他们在我的arrayList();

回答

3

你正在寻找的是Control#moveAbove(Control control)Control#moveBelow(Control control)进行重新排序的方法:

private static List<Label> labels = new ArrayList<Label>(); 
private static List<Color> colors = new ArrayList<Color>(); 

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("Stackoverflow"); 
    shell.setLayout(new RowLayout(SWT.VERTICAL)); 

    colors.add(display.getSystemColor(SWT.COLOR_BLUE)); 
    colors.add(display.getSystemColor(SWT.COLOR_CYAN)); 
    colors.add(display.getSystemColor(SWT.COLOR_GREEN)); 
    colors.add(display.getSystemColor(SWT.COLOR_YELLOW)); 
    colors.add(display.getSystemColor(SWT.COLOR_RED)); 

    for (int i = 0; i < 5; i++) 
    { 
     Label label = new Label(shell, SWT.BORDER); 
     label.setText("Button " + i); 
     label.setBackground(colors.get(i)); 

     labels.add(label); 
    } 

    Button sortButton = new Button(shell, SWT.TOGGLE); 
    sortButton.setText("Sort"); 

    sortButton.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event e) 
     { 
      Button source = (Button) e.widget; 

      final boolean asc = source.getSelection(); 

      Label oldFirst = labels.get(0); 

      Collections.sort(labels, new Comparator<Label>() 
      { 
       @Override 
       public int compare(Label o1, Label o2) 
       { 
        int result = o1.getText().compareTo(o2.getText()); 

        if (asc) 
         result = -result; 

        return result; 
       } 
      }); 

      Label label = labels.get(0); 
      label.moveAbove(oldFirst); 

      for (int i = 1; i < labels.size(); i++) 
      { 
       labels.get(i).moveBelow(labels.get(i - 1)); 
      } 
      shell.layout(); 
     } 
    }); 

    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

启动后:

enter image description here

按下该按钮后:

enter image description here

+0

非常明确的例子,将其作为答案! – Johnny000

+0

@ Johnny000干杯队友。欣赏它。 – Baz

+0

是不是moveAbove()和moveBelow()只适用于z轴?我有同样的问题和moveAbove/moveBelow将不会改变任何订单 – Stoppal

1

我找到了解决方案。你必须调用child.moveAbove(otherChild).moveBelow()当你与重新排序做到了父复合致电parent.layout()