Swing Storage von / Zugriff auf und durch Actions

Status
Nicht offen für weitere Antworten.

diggaa1984

Top Contributor
hiho,

ich bin wieder an einem Punkt angelangt wo ich jedesmal verzweifel, da ich noch keine einigermaßen brauchbare Lösung dazu gefunden habe.

Folgendes Szenario:
Es gib eine Action "NewFileAction" .. diese wird in einem Menü und in einer Toolbar eingebunden. Bei Klick auf die Action soll nun eine neue Datei erstellt werden (können versch. Kontext haben, zB neue Formeldatei oder neue Grammatikdatei). So, bei einer neuen Formeldatei brauch ich bspw ein neues Tab in einer JTabbedPane.

Soll heissen beim Auslösen der Action muss ich irgendwie in meine Editor-Klasse rein, welche das JTabbedPane darstellt um ein neues Tab zu erstellen. Ok, könnte man sich ja n Listener oder sowas schreiben, und den Editor bei der Action registriern .. oder einen Controller welcher das ganze vermittelt.

Nun gibt es aber noch ganz paar andere Actions .. und ich bin nicht gewillt für jede Action nen Controller oder ListenerKonzept bereitzustellen, da mir das rein konzeptionell irgendwie nicht zusagt. Ausserdem würde ich dann mit implements um mich werfen, was nicht wirklich schön ist.

Wie löst man denn solche Probleme elegant? Man hat haufen Actions, die man am besten wo lagert und wie mit diversen Sachen verknüpft?

Beispiel:
Java:
public class MainFrame extends JFrame {
    
    ...

    toolbar.add(/** NewFileAction .. Zugriff? */);

    ...
}

// --------------------------------

public class Editor extends JTabbedPane {

    //muss auf "newFile" reagieren können, wie an der Action ankoppeln
    //Action hier non-static deklarieren macht kein Sinn, komm ich in MainFrame 
    //nie und nimmer ran

}

// -------------------------------

public class NewFileAction extends AbstractAction {

    public NewFileAction() {
        //settings
    }


    public void actionPerformed {
        //Interessenten anschubsen
    }
}

der Weg an jeder Action Listener zu registrieren kann doch nicht der wahre sein oder, zumal das Interfaces mit, in der Regel, 1 Methode werden.
 

Ebenius

Top Contributor
Ich würde mir eine Handvoll Controller bauen, die die Eingaben der Actions entgegennehmen. Die Actions kennen ihren Controller und rufen die entsprechenden Methoden auf, um die Aktionen ausführen zu lassen. Dazu muss (und sollte) man ja nicht für jede Action einen eigenen Controller zur Verfügung stellen. Aber ich hätte mir im konkreten Beispiel einen DocumentEditorController gebaut. Die NewFileAction bekommt die Controller-Instanz im Konstruktor mit und ruft bei [c]actionPerformed[/c] eine entsprechende Methode im Controller auf. Die OpenFileAction würde den selben Controller nutzen, aber eine andere Methode rufen.

Der Controller wiederum bekommt ein DocumentEditorModel und steuert dieses. Die TabbedPane hängt (direkt oder indirekt) am DocumentEditorModel und bekommt mit, wenn sich in diesem was ändert.

Der DocumentEditorController verwaltet übrigens seine Actions. Bei ihm kann man sich die Actions abholen, um sie auf die Toolbar, in ein Menü, Kontextmenü, auf einen weiteren Button, ... zu setzen.

Just my $0.02, Ebenius
 
Zuletzt bearbeitet:

diggaa1984

Top Contributor
hm dann also doch so :)

Der DocumentEditorController verwaltet übrigens seine Actions. Bei ihm kann man sich die Actions abholen, um sie auf die Toolbar, in ein Menü, Kontextmenü, auf einen weiteren Button, ... zu setzen.

das ist dann also per Singleton zu lösen. Denn wenn ich mehrere Controller hätte, dann hätte ich auch mehrere Actions und da hätte ich Probleme wenn ich die in Menüs und Toolbars adde .. man stelle sich vor ich bekäme dann 2x openFile oder dergleichen.

weil eine andere Lösung ausser Singleton fällt mir da auch net ein. Schliesslich müssen die Actions ja static sein, damit ich im MainFrame rankomme, und ich soll den Controller übergeben können im Konstruktor => Action schnappt sich die Instanz
 

Ebenius

Top Contributor
Warum denn statisch und Singleton? Ich schrieb doch oben schon, die Actions bekommen die Controller-Instanz übergeben. Der Controller reicht die Actions raus. Die Anwendung kennt die Controller-Instanz. Von mir aus mach Dir eine Workspace-Klasse die die diversen Controller kennt, oder dergleichen. Eine Instanz dieser Klasse kannst Du dann in der Main-Methode aufbauen und dem Frame übergeben, oder ähnliches. Singleton ist da wirklich fehl am Platz und statische Member erst recht.

Die Main-Methode könnte so aussehen:
Java:
public static void main(String[] args) {
  final MyApplicationController mainController = new MyApplicationController(...); // oder auch über Factory, wie Du mags
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      final JFrame mainFrame = new MyApplicationMainFrame(mainController);
      mainFrame.pack();
      mainFrame.setLocationRelativeTo(null);
      mainFrame.setVisible(true);
    }
  });
}
Die Fensterklasse könnte so aussehen:
Java:
public class MyApplicationMainFrame extends JFrame {
  public MyApplicationController
  public MyApplicationMainFrame(MyApplicationController mainController) {
    this.mainController = mainController;

    ...
    final EditorController editorController = mainController.getEditorController()
    add(new MyEditorTabbedPane(editorController));
    ...
    for (Action a : editorController.getEditorActions()) {
      toolBar.add(a);
    }
  }
}
Ich will's nicht ausschreiben, aber kommt der Plan ungefähr an?

Ebenius
 

diggaa1984

Top Contributor
hm ja gut das is dann ungefähr doch das was ich bisher in etwa gemacht hatte .. dachte sowas geht eleganter .. aber ist vermutlich doch einfach nur n haufen fummelei ^^

Danke dir
 

Lexi

Bekanntes Mitglied
Habe im moment ähnliche Schwierigkeiten, kann deinen Ansatz hier aber noch nciht voll und ganz nachvollziehen, Ebenius.
Angenommen MyEditorTabbedPane aus deinem Beispiel ist eine JTabbedPane auf die man eine JTextPane o.ä. geaddet hat. Jetzt habe ich eine ClearTextPaneAction, welche die TextPane leer macht (.setText("") aufruft). Hierfür müsste die Action eine Instanz von der TextPane besitzen. Jetzt stellt sich mir die Frage, wo bekommt sie diese her? Gibt der EditorController die TextPaneInstanz an den Action Konstruktor, wenn er die Action erstellt? Dafür müsste MyEditorTabbedPane nen Getter für besagte TextPane besitzen, was auch wiederum unschön ist, oder?

Alternativ könnte man so wie MyEditorTabbedPane.clearText() einfügen, nur dann müsste ich ja im Prinzip für jeden kleinen Anwendungsfall ne Methode schreiben.

Du siehst ich bin ein wenig verwirrt, wäre super wenn du kann mir da Klarheit verschaffen könntest.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
L JavaFX Zugriff auf HostServices im FXML Controller AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
J JavaFX Zugriff auf Child AWT, Swing, JavaFX & SWT 4
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
wolfgang63 JavaFX Zugriff auf Guiobjekte die über FXML erstellt wurden AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
C JavaFX Zugriff auf TableView AWT, Swing, JavaFX & SWT 2
D JavaFX Zugriff auf Controller erlangen AWT, Swing, JavaFX & SWT 4
L Zugriff auf JavaFX Controls AWT, Swing, JavaFX & SWT 3
G JavaFX NullPointerException bei Zugriff auf FXML Element AWT, Swing, JavaFX & SWT 0
P Event Handling Anfängerfrage: ActionEvent bekommt kein Zugriff auf Objekt AWT, Swing, JavaFX & SWT 3
H SWT NullPointerException bei Zugriff auf Variablen des Hauptfensters AWT, Swing, JavaFX & SWT 6
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
B Zugriff auf JFrame obwohl die Klasse abgeleitet ist AWT, Swing, JavaFX & SWT 3
V JTable: Zugriff auf einzelne Zellen AWT, Swing, JavaFX & SWT 4
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
A Swing Zugriff auf JButton AWT, Swing, JavaFX & SWT 2
M Zugriff auf Variablen eines Objektes ohne sie auf static zu setzen AWT, Swing, JavaFX & SWT 9
I Swing Zugriff auf ein Objekt AWT, Swing, JavaFX & SWT 2
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
N zugriff auf frame AWT, Swing, JavaFX & SWT 5
N Swing Zugriff JButton auf JTree AWT, Swing, JavaFX & SWT 4
D Zugriff auf Instanz der GUI AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
H Zugriff JPanel AWT, Swing, JavaFX & SWT 3
S this-Zugriff auf Container höherer Ebene AWT, Swing, JavaFX & SWT 2
S Swing Zugriff auf Polyline in Grafik AWT, Swing, JavaFX & SWT 4
E Swing Zugriff auf Attribute eines JFrames über einen JDialog AWT, Swing, JavaFX & SWT 2
J Zugriff auf HtmlPanel sperren AWT, Swing, JavaFX & SWT 3
D JTree - Zugriff auf Nodes mit Object AWT, Swing, JavaFX & SWT 6
R Zugriff auf Component um addComponentListener() aufzurufen AWT, Swing, JavaFX & SWT 4
O Zugriff auf PreferenceStore aus der Business-Logik-Schicht? AWT, Swing, JavaFX & SWT 11
S NumberFormatException beim Zugriff auf Leeres JTextField AWT, Swing, JavaFX & SWT 8
S Zugriff auf statische Var in MouseEvent -> Warnung AWT, Swing, JavaFX & SWT 6
M Fehler beim Zugriff von awt-KeyListener auf swt-Shell AWT, Swing, JavaFX & SWT 2
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
X Zugriff auf "Oberparents" ? AWT, Swing, JavaFX & SWT 4
J JTextArea wird nicht aktualisiert bei Zugriff von außerhalb AWT, Swing, JavaFX & SWT 2
O DB-Zugriff + wie darstellen? AWT, Swing, JavaFX & SWT 6
F Problem bei Zugriff auf ComboBox Item AWT, Swing, JavaFX & SWT 4
G Zugriff auf JTextField AWT, Swing, JavaFX & SWT 2
J Zugriff auf "dynamisch erzeugte" JTextFields AWT, Swing, JavaFX & SWT 2
J Zugriff auf letzte Klasse AWT, Swing, JavaFX & SWT 4
M Zugriff auf Methoden aus einem ActionListener AWT, Swing, JavaFX & SWT 2
F Zugriff auf Oberfläche bzw Trennung GUI / Logik AWT, Swing, JavaFX & SWT 3
I selectedText: Wie bekomme ich Zugriff auf den Text? AWT, Swing, JavaFX & SWT 4
G Zugriff auf Bilder verweigern AWT, Swing, JavaFX & SWT 7
H Zugriff auf die Farbwerte eines Bildes AWT, Swing, JavaFX & SWT 6
G Zugriff auf TextField geht nicht AWT, Swing, JavaFX & SWT 5
G zugriff auf benutzeroberflächenelemente AWT, Swing, JavaFX & SWT 4
V Zugriff auf Components aus einem ActionListener AWT, Swing, JavaFX & SWT 3
M ActionListener-Zugriff durch mehrere Frames AWT, Swing, JavaFX & SWT 5
M Zugriff auf ComboBox! AWT, Swing, JavaFX & SWT 17
G Excel-Zugriff über POI: wohin mit dem Package? AWT, Swing, JavaFX & SWT 4
B Zugriff von Toolbar auf zugehörigen Frame AWT, Swing, JavaFX & SWT 6
O JTabbedPane - Zugriff auf die Elemente eines Tabs AWT, Swing, JavaFX & SWT 4
O JFileChooser - Zugriff auf Dateiname-Feld und Save-Button? AWT, Swing, JavaFX & SWT 6
E Zugriff auf JTextField nach Buttonklick AWT, Swing, JavaFX & SWT 6
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
A Panelwechsel durch RadioButtons AWT, Swing, JavaFX & SWT 1
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
S JavaFX Tab durch Enter ersetzten AWT, Swing, JavaFX & SWT 3
M Swing Durch Usereingabe neues Objekt AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
S Speicher Leak durch Tabellenaktualisierung AWT, Swing, JavaFX & SWT 5
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
S AWT JTextFields durch Array im JMenu erzeugen? AWT, Swing, JavaFX & SWT 19
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
G Swing Durch GlassPane auf Button klicken und ActionEvent auslösen AWT, Swing, JavaFX & SWT 0
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
P Programm durch Dateiaufruf starten und Datei öffnen AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
Z JavaFX Inhalt einer ViewTable durch Aktion einer Menubar ändern welche in einer anderen fxml ist AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben