2011-05-20 132 views
9

我使用Java枚舉來定義如何渲染帶按鈕的模式窗口(Vaadin處理渲染)。我的問題是,當我運行gui時,我的按鈕每次都是隨機排列的。所以我的問題是這樣的,因爲我使用枚舉集來保存我的按鈕,這將是無序的嗎?什麼是最好的方式,使其成爲一個有序列表?Java枚舉訂購

我的設置枚舉

public enum MODAL_SETTINGS { 
    NEW_MODAL_WINDOW("menu.context.new", "400", MODAL_BUTTON.SAVE, MODAL_BUTTON.CANCEL), 
    EDIT_MODAL_WINDOW("menu.context.modify","400", MODAL_BUTTON.UPDATE, MODAL_BUTTON.CANCEL), 
    DELETE_MODAL_WINDOW("menu.context.delete", "250", false, MODAL_BUTTON.DELETE, MODAL_BUTTON.CANCEL); 

    private EnumSet<MODAL_BUTTON> buttons; 
    private String caption; 
    private String width; 
    private boolean isResizable = true; 

    private MODAL_SETTINGS(String caption, String width, MODAL_BUTTON... buttons){ 
     this.setCaption(caption); 
     this.setWidth(width); 
     this.buttons = EnumSet.copyOf(Arrays.asList(buttons)); 
    } 

    private MODAL_SETTINGS(String caption, String width, boolean isResizable, MODAL_BUTTON... buttons){ 
     this.setCaption(caption); 
     this.setWidth(width); 
     this.isResizable = isResizable; 
     this.buttons = EnumSet.copyOf(Arrays.asList(buttons)); 
    } 

    public EnumSet<MODAL_BUTTON> getButtons(){ 
     return buttons; 
    } 

    @Override 
    public String toString(){ 
     String s = super.toString(); 
     s=s.replaceAll("_", "."); 
     return s; 
    } 

    public void setCaption(String caption) { 
     this.caption = caption; 
    } 

    public String getCaption() { 
     return caption; 
    } 

    public void setWidth(String width) { 
     this.width = width; 
    } 

    public String getWidth() { 
     return width; 
    } 

    public boolean isResizable() { 
     return isResizable; 
    } 
} 

我的按鈕枚舉

public enum MODAL_BUTTON { 
    SAVE, UPDATE, CANCEL, DELETE; 
} 

回答

22

使用,而不是Enum.values()EnumSet

注意,每個枚舉類型,返回一個靜態值的方法數組,其中包含按順序排列的所有枚舉類型的值他們被宣佈爲。此方法通常與for-each循環結合使用以遍歷枚舉類型的值。

來源:Enums in the Java 1.5 documentation

+0

+1爲你們所有人,因爲是正確的,'更先接我'。 – Boro 2011-05-20 09:04:16

5

按照documentation for Enumset,迭代器應該返回在它們被聲明的順序枚舉常量。

迭代器方法返回的迭代器以自然順序(聲明枚舉常量的順序)遍歷元素。返回的迭代器具有弱一致性:它永遠不會拋出ConcurrentModificationException,它可能會或可能不會顯示迭代過程中發生的任何修改對集合的影響。

雖然它可以是你的UI線程以不同的順序訪問枚舉的東西。

3

從EnumSet文檔:

由iteratormethod返回的迭代遍歷其自然順序(其中枚舉常數聲明的順序)的元素。

所以,你的問題是在別的地方。

1

您必須在實際分配按鈕的位置放置某些東西,這會改變它們的順序。試着給我們一個SSCCE

查看下面的示例代碼,其中每次運行時按鈕的順序對於所有行都是相同的。

import java.awt.GridLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class EnumeOrderButtonsTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       JPanel p = new JPanel(new GridLayout(0, MODAL_BUTTON.values().length)); 
       int noOfRows = 10; 
       for(int i = 0; i < noOfRows; i++) 
        for(MODAL_BUTTON mb : MODAL_BUTTON.values()) 
         p.add(new JButton(mb.name())); 

       JFrame f = new JFrame(); 
       f.setContentPane(p); 
       f.setSize(800, 600); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setVisible(true); 
      } 
     }); 
    } 

    public enum MODAL_BUTTON 
    { 
     SAVE, UPDATE, CANCEL, DELETE; 
    } 
}