Im使用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;
}
使用 Enum.values()
而不是 EnumSet
:
请注意,每个枚举类型都有一个静态值方法,该方法返回一个数组,其中包含枚举类型的所有值,按声明顺序排列。此方法通常与 for-each 循环结合使用,以循环访问枚举类型的值。
来源:Java 1.5 文档中的枚举
根据 Enumset 的文档,迭代器应按声明的顺序返回 Enum 常量。
迭代器方法返回的迭代器按元素的自然顺序(枚举常量的声明顺序)遍历元素。返回的迭代器是弱一致性的:它永远不会抛出 ConcurrentModificationException,并且它可能会也可能不会显示迭代过程中对集合进行的任何修改的效果。
尽管这可能是您的 UI 线程以不同的顺序访问枚举。
来自 EnumSet 文档:
迭代器方法返回的迭代器按元素的自然顺序(声明枚举常量的顺序)遍历元素。
所以,你的问题在别的地方。
你必须在你实际辅助按钮的地方有一些东西,这会改变它们的顺序。试着给我们一个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;
}
}