2011-05-20 129 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; 
    } 
}