2011-05-20 17 views
9

Im usando Java enums para definir cómo renderizar una ventana modal con botones (Vaadin maneja la representación). Mi problema es que cuando ejecuto el gui, mis botones vienen en orden aleatorio cada vez. Entonces mi pregunta es esta, ya que uso un conjunto de enum para mantener mis botones, ¿será eso desordenado? ¿Cuál es la mejor manera de convertirlo en una lista ordenada?enums de Java ordenando

Mi configuración enumeración

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

Mi botones enumeración

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

Respuesta

22

Uso Enum.values() en lugar de un EnumSet:

Tenga en cuenta que cada tipo de enumeración tiene un método de valores estáticos que devuelve una matriz que contiene todos los valores de la enumeración tipo en el orden están declarados. Este método se usa comúnmente en combinación con el ciclo for-each para iterar sobre los valores de un tipo enumerado.

Fuente: Enums in the Java 1.5 documentation

+0

+1 para todos ustedes, por ser correcto y "más primero que yo". – Boro

5

De acuerdo con la documentation for Enumset, el repetidor debe devolver las constantes de enumeración en el orden en el que fueron declaradas.

El iterador devuelto por el método del iterador recorre los elementos en su orden natural (el orden en que se declaran las constantes enum). El iterador devuelto es débilmente consistente: nunca lanzará ConcurrentModificationException y puede o no mostrar los efectos de cualquier modificación al conjunto que ocurra mientras la iteración está en progreso.

Aunque puede tratarse de algo con su subproceso de UI accediendo a los Enume en diferentes órdenes.

3

De documentación EnumSet:

El iterador que devuelve el iteratormethod atraviesa los elementos en su orden natural (el orden en que se declaran las constantes de enumeración).

Por lo tanto, su problema es otro.

1

Debe tener algo en el lugar donde está asignando los botones, lo que cambia su orden. Intenta darnos un SSCCE.

Eche un vistazo al código de ejemplo que se muestra a continuación, donde cada vez que lo ejecute, el orden de los botones será el mismo para todas las filas.

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