簡體   English   中英

如何動態構建JMenu(而不僅僅是運行時創建)?

[英]How do I build a JMenu dynamically (and not merely run-time creation)?

需要明確的是,這里出現的幾個類似的條目實際上並沒有談論動態地構建菜單,因為它們的所有對象名稱選擇以及已經在源代碼中寫入的固定字符串都已經存在於它們的代碼中。 他們所做的只是等到運行時創建其靜態設計的菜單項。 這是我發現的兩個條目: 一個兩個。 那里的擔憂僅與刷新顯示的瑣碎(但至關重要)任務有關,而與諸如實際動態創建內容之類的無關。

與之形成鮮明對比的是,我要做的是真正地動態添加:我希望用戶能夠選擇將項目添加到子菜單中,然后他們可以選擇這些子菜單並在應用程序中采取措施。

讓我們以簡單地將一個整數值添加到菜單中,然后以后可以選擇它為例,這與通過組合框輕松完成但通過菜單輕松完成操作類似。

問題不是與定義有關的語法,例如,一個MenuListener指向一個知道如何操作的方法,這不是問題。 相反,我只是對動態NAMING SPACE以及如何“取消引用”字符串(例如,作為對象名稱)了解得不夠多。 坦率地說,我該如何動態命名我沒想到要創建的新對象(不是實物而是數量)? IOW,我該如何巧妙地構造一個實際上包含要運行的代碼的字符串,然后要求Java運行它? Java的語法是什么? 也許可以將問題簡化為對象名稱。 說,這個名字是我可以構造的字符串。 如何在我的JMenuItem聲明中使用它? ...我知道如何在BASH中執行此操作,但是如何在Java中執行此操作?

(我希望不必將其創建為文件,無需進行編譯,也可以將類文件附加到正在運行的程序中,然后運行它-DAMN會很麻煩!)

謝謝。

如果我了解您的總體意圖,那么我建議從Actions API開始,該API用於創建獨立的工作單元,這些工作單元與它們的顯示方式無關。

這使您可以定義可重用(或動態情況下)的操作,這些操作可以通過菜單,工具欄,按鈕甚至鍵綁定立即執行。

因為設置Action可能有些乏味,所以我可能會考慮使用構建器模式,但您不必這樣做,可以根據需要手動構建它們;)

public class ActionBuilder {
    private ActioBuilderAction action;

    public ActionBuilder() {
        action = new ActionBuilder.ActioBuilderAction();
    }

    public ActionBuilder toolTip(String text) {
        action.putValue(Action.SHORT_DESCRIPTION, text);
        return this;
    }

    public ActionBuilder command(String text) {
        action.putValue(Action.ACTION_COMMAND_KEY, text);
        return this;
    }

    public ActionBuilder mnemonic(int key) {
        action.putValue(Action.MNEMONIC_KEY, key);
        return this;
    }

    public ActionBuilder displayedMnemonicIndex(int index) {
        action.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, index);
        return this;
    }

    public ActionBuilder text(String text) {
        action.putValue(Action.NAME, text);
        return this;
    }

    public ActionBuilder smallIcon(Icon icon) {
        action.putValue(Action.SMALL_ICON, icon);
        return this;
    }

    public ActionBuilder largeIcon(Icon icon) {
        action.putValue(Action.LARGE_ICON_KEY, icon);
        return this;
    }

    public ActionBuilder acceleratorKey(KeyStroke ks) {
        action.putValue(Action.ACCELERATOR_KEY, ks);
        return this;
    }

    public ActionBuilder actionListener(ActionListener listener) {
        action.setListener(listener);
    }

    public Action build() {
        return action;
    }

    public class ActioBuilderAction extends AbstractAction {

        private ActionListener listener;

        public void setListener(ActionListener listener) {
            this.listener = listener;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (listener != null) {
                listener.actionPerformed(e);
            }
        }

    }
}

然后,您可以簡單地建立一個新菜單,例如...

Action action = new ActionBuilder().text("Super awesome command").actionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Super aweseom comand GO!");
    }
}).build();

JMenuItem mi = new JMenuItem(action);

現在,我想像一下,您可能會有某種“命令執行器”類。 實際執行命令。 我將創建一個實現ActionListener的橋接類,並在調用該類時執行指定的命令

public class CommandListener implements ActionListener {
    private String command;

    public CommandListener(String command) {
        this.command = command;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        CommandExecutor executor = new CommandExecutor();
        executor.execute(command)
    }


}

然后可以在第一個示例中使用它代替ActionListener

Action action = new ActionBuilder().text(commandName).actionListener(new CommandListener(command)).build();

總體思路

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM