упорядочивание перечислений java - PullRequest
10 голосов
/ 20 мая 2011

Я использую java-перечисления, чтобы определить, как визуализировать модальное окно с кнопками (Vaadin управляет рендерингом).Моя проблема в том, что когда я запускаю графический интерфейс, мои кнопки каждый раз располагаются в случайном порядке.Итак, мой вопрос заключается в следующем: поскольку я использую набор enum для хранения кнопок, это будет неупорядоченным?Какой лучший способ превратить его в упорядоченный список?

Мои настройки enum

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

Мои кнопки enum

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

Ответы [ 4 ]

24 голосов
/ 20 мая 2011

Используйте Enum.values() вместо EnumSet:

Обратите внимание, что у каждого типа перечисления есть метод статических значений, который возвращает массив, содержащий все значения типа перечисления в порядке их объявления . Этот метод обычно используется в сочетании с циклом for-each для итерации значений перечислимого типа.

Источник: Перечисления в документации по Java 1.5

7 голосов
/ 20 мая 2011

Согласно документации для Enumset , итератор должен возвращать константы Enum в порядке, в котором они были объявлены.

Итератор, возвращаемый методом итератора, пересекает элементы в их естественном порядке (порядок, в котором объявлены константы перечисления). Возвращенный итератор слабо согласован: он никогда не вызовет исключение ConcurrentModificationException и может показать или не показать влияние любых изменений набора, которые происходят во время выполнения итерации.

Хотя это может быть связано с тем, что ваш поток пользовательского интерфейса обращается к Enums в разных порядках.

4 голосов
/ 20 мая 2011

Из документации EnumSet:

Итератор, возвращаемый методом итератора, обходит элементы в их естественном порядке (порядке, в котором объявляются константы перечисления).

Итак, ваша проблема в другом месте.

1 голос
/ 20 мая 2011

У вас должно быть что-то в том месте, где вы на самом деле назначаете кнопки, что меняет их порядок. Попробуйте дать нам 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;
    }
}
...