12

ボタン付きのモーダルウィンドウをレンダリングする方法を定義するためにJava列挙型を使用しています(Vaadinがレンダリングを処理します)。私の問題は、GUI を実行すると、ボタンが毎回ランダムな順序で表示されることです。だから私の質問はこれです.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;
    }
}

私のボタンの列挙

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

4 に答える 4

28

Enum.values()の代わりに使用EnumSet:

各列挙型には、宣言された順序で列挙型のすべての値を含む配列を返す静的値メソッドがあることに注意してください。このメソッドは、列挙型の値を反復処理するために、for-each ループと組み合わせて一般的に使用されます。

出典: Java 1.5 ドキュメントの Enums

于 2011-05-20T08:56:03.317 に答える
7

Enumsetのドキュメントによると、反復子は Enum 定数を宣言された順序で返す必要があります。

iterator メソッドによって返される反復子は、自然な順序 (列挙定数が宣言されている順序) で要素をトラバースします。返されたイテレータは一貫性が弱く、ConcurrentModificationException をスローすることはなく、イテレーションの進行中に発生したセットへの変更の影響を示す場合と示さない場合があります。

UIスレッドがさまざまな順序で列挙型にアクセスすることについて何かが起こる可能性があります。

于 2011-05-20T08:57:33.913 に答える
4

EnumSet ドキュメントから:

iteratormethod によって返される反復子は、自然な順序(列挙定数が宣言されている順序) で要素をトラバースします。

だから、あなたの問題は別の場所にあります。

于 2011-05-20T08:59:42.397 に答える
1

ボタンを実際に割り当てている場所に何かが必要であり、これによりボタンの順序が変更されます。私たちに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;
    }
}
于 2011-05-20T09:00:50.783 に答える