Hilfsklasse Menüpunkterstellung

Ich weiß zwar nicht, ob hier noch viele Swing benutzen, aber ich habe mir eine kleine Hilfsklasse gebastelt, um eleganter Menüpunkte anlegen zu können. Ob das wirklich eleganter / schöner ist, darüber kann man sich sicher trefflich streiten, aber ich stelle sie euch einfach mal vor.

Menüpunkt-Erzeugung herkömmlich:

        JMenuItem item = new JMenuItem("letzter Datensatz", 'l');
        item.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gui.showLastDocument();
            }
        });
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_END, Event.ALT_MASK));
        return item;
    }

Menüpunkt-Erzeugung mit Hilfsklasse:

        return new MyMenuItem("letzter Datensatz")
                .mnemonic('l')
                .accelerator(KeyEvent.VK_END, Event.ALT_MASK)
                .actionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        gui.showLastDocument();
                    }
                });
    }

Hilfsklasse:


    private static final long serialVersionUID = -1;

    public MyMenuItem(String text) {
        super(text);
    }

    public MyMenuItem mnemonic(char mnemonic) {
        setMnemonic(mnemonic);
        return this;
    }

    public MyMenuItem accelerator(int keyCode, int modifiers) {
        setAccelerator(KeyStroke.getKeyStroke(keyCode, modifiers));
        return this;
    }

    public MyMenuItem actionListener(ActionListener actionListener) {
        addActionListener(actionListener);
        return this;
    }

}```

tja, solche Klassen kann man sich immer und überall schreiben,
die allgemeiner Abwegung wie weit es einen selber hilft/ den Quellcode vor Wiederholungen befreit
vs. vielleicht andere Leser etwas verwirrt/ zu anderen Frameworks/ Standards inkompatibel wird


wenn man dabei ist, kann man es auch noch stärker betreiben :wink:

        return new MyMenuItem("letzter Datensatz",'l') { // schon im JMenuItem so, also die mnemonic-Methode von dir wohl extra gewünscht
                    @Override
                    public void action() { // MyMenuItem gleich auch der ActionListener bzw. nur irgendeine zu überschreibende Methode 
                  // ohne das meist unnötige ActionEvent und ActionListener, der action() aufruft, automatisch erstellt,
                  // solche Stellen (im MyMenuItem) dann auch gut zentral einzeln geeignet, um Exceptions abzufangen und sinnvoll zu loggen usw.,
                  // wo normale ActionListener versagen, wenn nicht wiederum eigene ActionListener-Basisklasse..
                        gui.showLastDocument();
                    }
                }
                .alt(KeyEvent.VK_END); // Extra-Methode für die Event.ALT_MASK-Fälle
    }

oder ähnliches

Sowas würde/könnte man eher Action-Objekte erstellen lassen. Der Boilerplate-Code, der für die nötig ist, kann wirklich lästig sein (kürzlich erst wieder: https://github.com/javagl/JglTF/blob/master/jgltf-browser/src/main/java/de/javagl/jgltf/browser/GltfBrowserApplication.java#L90 …). Der Vorteil wäre, dass man sowohl

new JMenuItem(…actionCreationCode…);
als auch
new JButton(…actionCreationCode…);
schreiben könnte.

schick wäre eine Action-ähnliche Konfiguration, ruhig zunächst auch mit der Action-Klasse,
und diese an das Interface der GUI per addToMenu(action, positionImMenu) oder addButton(action,positionImLayout) zu übergeben

die GUI ist austauschbar entweder Swing oder ähnliches Framework, welches daraus JMenuItem & Co. baut,
oder auch eine Weboberfläche, die daraus das an den Client zu schickende HTML richtig zusammenbaut und später Klicks zur hinterlegten Ausführungsmethode leitet :wink:
oder Konsolen-Menü oder oder

Der Punkt der mich etwas stört, bzw. den ich anders machen würde ist der Namen.

Das Hauptargument ist nicht, dass das MyMenuItem ein JMenuItem ist, sondern dass es hilft solch eines zu erstellen. Wenn es also dazu da ist, ein JMenuItem zu erstellen, dann wäre ein JMenuItemBuilder der passende Name.

Das führt dann zum nächsten Punkt. Wenn das ganze …Builder heißt, dann kann ich auch das Builder-Pattern soweit Möglich anwenden und dem ganzen eine Build-Methode spendieren und auf die Vererbung von JMenuItem verzichten.
Das würde das ganze für mich gleich klar und ersichtlich machen, was denn die Aufgabe dieser Klasse ist.