12

我使用 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;
}
4

4 回答 4

28

使用Enum.values()而不是EnumSet

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

来源:Java 1.5 文档中的枚举

于 2011-05-20T08:56:03.317 回答
7

根据Enumset 的文档,迭代器应该按照声明的顺序返回 Enum 常量。

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

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

于 2011-05-20T08:57:33.913 回答
4

从 EnumSet 文档:

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

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

于 2011-05-20T08:59:42.397 回答
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;
    }
}
于 2011-05-20T09:00:50.783 回答