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