порядок перечислений java

#java #enums #enumset

#java #перечисления #enumset

Вопрос:

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

Перечисление моих настроек

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

Ответ №1:

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

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

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

Комментарии:

1. 1 всем вам, ребята, за корректность и «сначала больше, потом я».

Ответ №2:

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

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

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

Ответ №3:

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

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

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

Ответ №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;
    }
}