Aloha, ein neues Problem tut sich auf
Folgende Situation und ich hoffe ich könnt mir nen Tipp geben wie man das ganze möglichst OO Lösen kann
meine GUI setzt sich aus mehreren Bestandteilen ( Komponenten ) zusammen, ich habe einen OO Orientierten Ansatz gewählt und realisiere die einzelnen Komponenten in Separaten Klassen , und dies sorgt grade für mehr Probleme als für Lösungen ,
hier mal ein Beispiel:
Diese MenuBar binde ich in meiner GUI bzw. dem HauptFrame ein und halte eine Referenz auf darauf
Hier ein ausschnitt:
(Eine Funktionierende Lösung hatte ich bereits geschrieben, allerdings waren da alle Komponenten 'ToolBar / MenuBar' in einer Klasse realisiert, und nicht in eigentständigen. )
Klar , ich könnte jetzt innerhalt der einzelnen Komponenten Innere Klassen erstellen welche das ActionListener Interface implementiert und sich dann um die Eventbehandlung kümmern, allerdings sollte dies ja eigentlich der Controller übernehmen oder nicht (wenn man jetzt von einem MVC Pattern ausgeht) und nicht eine Komponente der View, außerdem müsste ich dann je in jeder Komponente , da diese ja in Separaten Klassen realisiert sind ,
eine Referenz auf das Hauptframe halten und ich dort dementsprechende getter anbieten um an die Panel etc. zu kommen in welche später weitere Komponenten eingefügt werden solle, da ich ja z.B wie im Bild oben beschrieben von der Menu oder Toolbar aus garnicht auf die Panel der eigentlichen GUI zugreifen könnte.
Gibt es da keine sauberere Lösung ?
Bzw. wie wird sowas im Normalfall realisiert, ich könnte natürlich auch den Source Code der MenuBar in der eigentlichen View realisieren , allerdings wäre das doch 1. unschön und 2. nicht sonderlich Objekt Orientiert oder ?
Außerdem bläht das den Source Code doch nur unnötig auf....
Folgende Situation und ich hoffe ich könnt mir nen Tipp geben wie man das ganze möglichst OO Lösen kann
meine GUI setzt sich aus mehreren Bestandteilen ( Komponenten ) zusammen, ich habe einen OO Orientierten Ansatz gewählt und realisiere die einzelnen Komponenten in Separaten Klassen , und dies sorgt grade für mehr Probleme als für Lösungen ,
hier mal ein Beispiel:
Java:
package de.kaoz.components;
import static de.kaoz.constants.Constants.MENUBAR_EDIT;
import static de.kaoz.constants.Constants.MENUBAR_FILE;
import static de.kaoz.constants.Constants.MENUBAR_HELP;
import static de.kaoz.constants.Constants.MENUBAR_OPTION;
import static de.kaoz.constants.Constants.MENUBAR_SEARCH;
import static de.kaoz.constants.Constants.MENUBAR_WINDOW;
import java.util.ArrayList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class SimpleMenuBar extends JMenuBar{
private static final long serialVersionUID = 1L;
ArrayList<JMenuItem> itemList = new ArrayList<>();
JMenu fileMenu, editMenu, optionMenu, searchMenu, windowMenu, helpMenu;
public SimpleMenuBar() {
createMenu();
addToBar();
}
private void createMenu() {
fileMenu = new JMenu(MENUBAR_FILE);
JMenu newFile = new JMenu("Neu...");
JMenuItem invoice = new JMenuItem("Rechnung");
JMenuItem estimate = new JMenuItem("Kostenvoranschlag");
newFile.add(invoice);
newFile.add(estimate);
JMenuItem openFile = new JMenuItem("Öffnen...");
JMenuItem save = new JMenuItem("Speichern");
JMenuItem saveAs = new JMenuItem("Speichern als...");
JMenuItem print = new JMenuItem("Drucken");
JMenuItem importFile = new JMenuItem("Importieren...");
JMenuItem exportFile = new JMenuItem("Exportieren...");
JMenuItem close = new JMenuItem("Beenden");
fileMenu.add(newFile);
fileMenu.add(openFile);
fileMenu.addSeparator();
fileMenu.add(save);
fileMenu.add(saveAs);
fileMenu.addSeparator();
fileMenu.add(print);
fileMenu.addSeparator();
fileMenu.add(importFile);
fileMenu.add(exportFile);
fileMenu.addSeparator();
fileMenu.add(close);
editMenu = new JMenu(MENUBAR_EDIT);
JMenuItem stepBack = new JMenuItem("Rückgängig machen");
JMenuItem cut = new JMenuItem("Ausschneiden");
JMenuItem copy = new JMenuItem("Kopieren");
JMenuItem paste = new JMenuItem("Einfügen");
JMenuItem delete = new JMenuItem("Löschen");
editMenu.add(stepBack);
editMenu.addSeparator();
editMenu.add(cut);
editMenu.add(copy);
editMenu.add(paste);
editMenu.addSeparator();
editMenu.add(delete);
optionMenu = new JMenu(MENUBAR_OPTION);
JMenuItem options = new JMenuItem("Einstellungen");
JMenuItem savePath = new JMenuItem("Speicherort bearbeiten");
JMenuItem userData = new JMenuItem("Nutzerdaten bearbeiten");
optionMenu.add(options);
optionMenu.addSeparator();
optionMenu.add(savePath);
optionMenu.add(userData);
searchMenu = new JMenu(MENUBAR_SEARCH);
JMenuItem searchClient = new JMenuItem("Kunden suchen");
JMenuItem searchInvoice = new JMenuItem("Rechnung suchen");
JMenuItem searchEstimate = new JMenuItem("Kostenvoranschlag suchen");
searchMenu.add(searchClient);
searchMenu.add(searchInvoice);
searchMenu.add(searchEstimate);
windowMenu = new JMenu(MENUBAR_WINDOW);
JMenu resolution = new JMenu("Auflösung anpassen...");
JMenuItem small = new JMenuItem("800 x 600");
JMenuItem middle = new JMenuItem("1024 x 768");
JMenuItem big = new JMenuItem("1280 x 1024");
resolution.add(small);
resolution.add(middle);
resolution.add(big);
windowMenu.add(resolution);
helpMenu = new JMenu(MENUBAR_HELP);
JMenuItem shortcuts = new JMenuItem("Tastenkombinationen");
JMenuItem about = new JMenuItem("Info");
JMenuItem support = new JMenuItem("Support und Hilfe");
helpMenu.add(shortcuts);
helpMenu.add(about);
helpMenu.add(support);
}
private void addToBar(){
this.add(fileMenu);
this.add(editMenu);
this.add(searchMenu);
this.add(optionMenu);
this.add(helpMenu);
}
}
Diese MenuBar binde ich in meiner GUI bzw. dem HauptFrame ein und halte eine Referenz auf darauf
Hier ein ausschnitt:
(Eine Funktionierende Lösung hatte ich bereits geschrieben, allerdings waren da alle Komponenten 'ToolBar / MenuBar' in einer Klasse realisiert, und nicht in eigentständigen. )
Java:
package de.kaoz.views;
import static de.kaoz.constants.Constants.APP_TITLE;
import static de.kaoz.constants.Constants.SCREEN_HEIGHT;
import static de.kaoz.constants.Constants.SCREEN_WIDTH;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.border.EtchedBorder;
import de.kaoz.components.SimpleMenuBar;
import de.kaoz.components.SimpleToolBar;
import de.kaoz.util.FrameFactory;
public class EditorView {
JFrame frame;
SimpleMenuBar menuBar; //<<-- Referenz auf die MenuBar
JToolBar toolBar;
JPanel contentPane, sidePanel, printPanel, statusBar;
public EditorView() {
frame = FrameFactory.createFrame(APP_TITLE, SCREEN_WIDTH, SCREEN_HEIGHT, 2, JFrame.MAXIMIZED_BOTH, null);
createMenuBar();
createToolBar();
createPanel();
addComponents();
}
private void createMenuBar(){
menuBar = new SimpleMenuBar();
}
...
Klar , ich könnte jetzt innerhalt der einzelnen Komponenten Innere Klassen erstellen welche das ActionListener Interface implementiert und sich dann um die Eventbehandlung kümmern, allerdings sollte dies ja eigentlich der Controller übernehmen oder nicht (wenn man jetzt von einem MVC Pattern ausgeht) und nicht eine Komponente der View, außerdem müsste ich dann je in jeder Komponente , da diese ja in Separaten Klassen realisiert sind ,
eine Referenz auf das Hauptframe halten und ich dort dementsprechende getter anbieten um an die Panel etc. zu kommen in welche später weitere Komponenten eingefügt werden solle, da ich ja z.B wie im Bild oben beschrieben von der Menu oder Toolbar aus garnicht auf die Panel der eigentlichen GUI zugreifen könnte.
Gibt es da keine sauberere Lösung ?
Bzw. wie wird sowas im Normalfall realisiert, ich könnte natürlich auch den Source Code der MenuBar in der eigentlichen View realisieren , allerdings wäre das doch 1. unschön und 2. nicht sonderlich Objekt Orientiert oder ?
Außerdem bläht das den Source Code doch nur unnötig auf....
Zuletzt bearbeitet: