Prüfen ob es Variable mit Namen gibt der als String übergeben wird

  • Themenstarter Themenstarter phip1611
  • Beginndatum Beginndatum
P

phip1611

Gast
Hallo liebe Forenmitglieder,

Ich habe zwei Klassen, eine für die GUI (von NetBeans erzeugt) und eine für die Programm-Logik. In der GUI-Klasse habe ich aktuell eine Methode setButtonEventListener(ActionListener al)i, damit ich von außen steuern kann was gerade bei einem Button-Klick geschehen soll. Das ganze geht allerdings nur, wenn ich zuvor in der GUI-Klasse eine Methode für den entsprechenden Button erstelle um von außen darauf Einfluss nehmen zu können.

Ich dachte evtl an eine Methode bei der ich mit einem weiteren Parameter angebe für welchen Button das ganze aktuell gerade gelten soll in folgender Art:
Java:
public void setEventListener(ActionListener al, String guiElement) {

/* wenn es eine Variable (z.b. Button mit dem Name {guiElement} gibt, soll dieses Objekt angesprochen werden und den ActionListener zugewiesen bekommen */
}

Versteht ihr was ich meine? Und ist das sinnvoll? Wäre eben schön dynamisch, so muss ich nicht für jedes Grafik-Element einzeln diese Methoden schreiben
 
Mit Reflection geht das schon, sofern die Buttons Member des Objects sind, ist aber vielleicht nicht unbedingt ratsam.
Und soviel bringt es in diesem Fall nicht.
Ob du nun btnXYZ.addActionListener(al) oder setEventListener(al, "btnXYZ") benutzt, macht doch im Grunde keinen großen unterschied.
 
Ich könnte das ganze doch auch managen, wenn alle Buttons in einem Enum registriert sind, nicht wahr? Dann kann ich ja übergeben für welchen Eintrag ein Event-Listener sein soll?
 
Ich habe es jetzt mit Enums gemanaged, ist ganz cool. Was meint ihr dazu?
Das Ganze baut nun auf folgendes Konstrukt auf, mir gefällt das ganz gut:

Java:
gui.addEventListener(
                GUI.Buttons.EXIT_BUTTON,
                new GUI.ShutDownActionListener()
        );

------------------
Java:
package de.phip1611.playground;

public class JavaTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new JavaTest();
    }
  
    public JavaTest() {
        GUI gui = new GUI();
        gui.buildGui();
        gui.addEventListener(
                GUI.Buttons.EXIT_BUTTON,
                new GUI.ShutDownActionListener()
        );
        gui.addEventListener(
                GUI.Buttons.EXE_BUTTON,
                new GUI.ExeActionListener()
        );
        gui.showGui();
    }
}


Java:
package de.phip1611.playground;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUI {
  
    private final JFrame frame;
    private final JPanel panel;
  
    public GUI() {
        this.frame = new JFrame();
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.panel = new JPanel();
    }
  
    public void buildGui() {
        for (Buttons button : Buttons.values()) {
            this.panel.add(button.getButton());
        }
        this.frame.add(this.panel);
        this.frame.pack();
    }
  
    public void showGui() {
        this.frame.setVisible(true);
    }
  
    public void addEventListener(Buttons button, ActionListener al) {
        GUI.Buttons.valueOf(button.toString()).addEventListener(al);
    }
  
    public enum Buttons {      
        EXE_BUTTON() {
            JButton button = new JButton("Aktion ausführen!");

            @Override
            protected void addEventListener(ActionListener al) {
                this.button.addActionListener(al);
            }
          
            @Override
            protected JButton getButton() {
                return this.button;
            }
        },
        EXIT_BUTTON() {
            JButton button = new JButton("Programm beenden!");

            @Override
            protected void addEventListener(ActionListener al) {
                this.button.addActionListener(al);
            }
          
            @Override
            protected JButton getButton() {
                return this.button;
            }
        };
      
        protected abstract void addEventListener(ActionListener al);
        protected abstract JButton getButton();
    }
  
    public static class ShutDownActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }
  
    public static class ExeActionListener implements ActionListener {
        JLabel label = new JLabel("Glückwunsch, du hast den Button erfolgreich gedrückt! :D");
      
        @Override
        public void actionPerformed(ActionEvent e) {
            JDialog jdialog = new JDialog();
            jdialog.setTitle("Hallo");
            jdialog.add(
              new JPanel().add(
                label
              )
            );
            jdialog.pack();
            jdialog.setVisible(true);
          
        }
    }
}
 
Ich empfinde die Lösung als unsinnig. Klar, es geht und ist sogar halbwegs übersichtlich.
Aber in Bezug zur Wartbarkeit etc. ist es halt eher schlecht und allgemein das Design, Buttons (welche nur für einen JFrame gedacht sind) global zugreifbar zu machen ist eine eher schlechte Idee.

Und denk nochmal über diese Zeile nach:
GUI.Buttons.valueOf(button.toString()).addEventListener(al);
Du erhälst ein Objekt vom Typ Buttons. wandelst das dann in einen String um, nur um über valueOf den das zu dem String passende Buttons Objekt zu bekommen. Was logischerweise das gleiche ist, wie du bereits übergeben bekommen hast... button.addEventListener(al);
 
Ich finde das Ganze steigt die Wartbarkeit extrem.. So kann ich schnell neue ActionListener hinzufügen die verschiedene Aufgaben lösen etc. Außerdem habe ich gar keinen globalen Zugriff weil ich weiß man soll das nicht machen. Ich finde diese Methode aber super cool, da ich so schnell von außen angeben kann welches Komponente gemeint ist ohne Zugriff auf diese zu haben.

Habe Zugriff von außen, aber alles was mit Änderungen zu tun hat wird nur von der GUI-Klasse gemacht.
 
Natürlich hast du globalen Zugriff: Buttons.EXE_BUTTON.getButton();
Du kannst also von jeder Klasse (im selben package) aus den Text des Buttons etc. verändern.
 
Ach so meinst du das. Stimtm, Entschuldigung 🙁 Dann ändere ich die Methode einfach und mache sie private
 

Zurück
Oben