【问题标题】:java enums orderingjava枚举排序
【发布时间】:2011-08-29 11:58:33
【问题描述】:

我使用 java 枚举来定义如何使用按钮呈现模式窗口(Vaadin 处理呈现)。我的问题是,当我运行 gui 时,我的按钮每次都以随机顺序出现。所以我的问题是,因为我使用枚举集来保存我的按钮,那会是无序的吗?将其放入有序列表的最佳方法是什么?

我的设置枚举

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;
}

【问题讨论】:

    标签: java enums enumset


    【解决方案1】:

    使用Enum.values() 而不是EnumSet

    请注意,每个枚举类型都有一个静态值方法,该方法返回一个数组,其中包含枚举类型的所有值按照声明的顺序。此方法通常与 for-each 循环结合使用,以迭代枚举类型的值。

    来源:Enums in the Java 1.5 documentation

    【讨论】:

    • +1 为你们所有人,因为他们是正确的,并且“比我更重要”。
    【解决方案2】:

    根据documentation for Enumset,迭代器应该按照声明的顺序返回枚举常量。

    迭代器方法返回的迭代器以元素的自然顺序(枚举常量的声明顺序)遍历元素。返回的迭代器是弱一致的:它永远不会抛出 ConcurrentModificationException 并且它可能会或可能不会显示在迭代过程中对集合进行的任何修改的影响。

    虽然它可能与您的 UI 线程以不同的顺序访问枚举有关。

    【讨论】:

      【解决方案3】:

      来自 EnumSet 文档:

      迭代器方法返回的迭代器以元素的自然顺序(枚举常量的声明顺序)遍历元素。

      所以,你的问题出在其他地方。

      【讨论】:

        【解决方案4】:

        您必须在实际分配按钮的地方有一些东西,这会改变它们的顺序。尝试给我们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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多