Nochmal Swing, MVC und generelles Design

Status
Nicht offen für weitere Antworten.

mvitz

Top Contributor
Hallo zusammen,

ich hänge zur Zeit an einer privaten Applikation um meine Finanzen zu verwalten. Das ganze soll als Übung für mich dienen.

Ich bin aber generell mit einigen Dingen im Design irgendwie unzufrieden bzw. finde diese relativ kompliziert. Aus diesem Grunde frage ich hier erneut nach einigen Tipps & Tricks, was ich am bisher bestehenden noch ändern kann.

Am schlimmsten/komischten finde ich es eigentlich, dass man bestimmte GUI Elemente, sowie den Controller/Persistenzmanager durch die gesamte Applikation durchreichen muss.

Vorneweg sei gesagt, dass die Codeauszüge relativ groß sind.

Main, startet die Applikation mit Erzeugung von GUI und meiner Persistenzlösung. Denke hier kann man nicht viel anders machen.
Code:
package de.vitz.jfinancemanager2;

import javax.swing.SwingUtilities;

import de.vitz.jfinancemanager2.controller.HashAccountManager;
import de.vitz.jfinancemanager2.view.GUI;

public class Main {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new GUI(new HashAccountManager());
			}
		});
	}
}

Das Account Model. Implementiert Observable um die GUI benachrichtigen zu können. Denke das sollte auch noch alles in Ordnung sein.
Code:
package de.vitz.jfinancemanager2.model;

import java.util.LinkedList;
import java.util.List;
import java.util.Observable;

public class Account extends Observable {

	private String name;
	private double amount;

	public Account(String name) {
		super();
		this.name = name;
		amount = 0;
	}

	public String getName() {
		return name;
	}

	public double getAmount() {
		return amount;
	}

	public void setAmount(double amount) {
		this.amount = amount;
		setChanged();
		notifiyObservers();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj != null && obj.getClass().equals(Account.class)) {
			if (((Account) obj).getName().equals(name)) {
				return true;
			}
		}
		return false;
	}
}

Interface für die Persistenz/Controller Schicht.
Code:
package de.vitz.jfinancemanager2.controller;

import de.vitz.jfinancemanager2.model.Account;

public interface IAccountManager {

	public Account createAccount(String name);

	public boolean removeAccount(String name);
}

Implementierung der Persistenz/Controller Schicht. Ist das so ok oder entspricht das nicht wirklich einem "guten" Controller?
Code:
package de.vitz.jfinancemanager2.controller;

import java.util.LinkedList;
import java.util.List;

import de.vitz.jfinancemanager2.model.Account;

public class HashAccountManager implements IAccountManager {

	private List<Account> accounts;

	public HashAccountManager() {
		accounts = new LinkedList<Account>();
	}

	@Override
	public Account createAccount(String name) {
		Account account = new Account(name);
		if (accounts.contains(account)) {
			throw new RuntimeException("Account exists.");
		}
		accounts.add(account);
		return account;
	}

	@Override
	public boolean removeAccount(String name) {
		Account account = new Account(name);
		if (accounts.contains(account)) {
			accounts.remove(account);
			return true;
		} else {
			return false;
		}
	}
}

Die Hauptgui. Ganz normale initialisierung mit einer JMenuBar und einer JTabbedPane zur Anzeige der Accounts. Ist das so noch ok oder sind hier bereits größere Fehler dabei?
Code:
package de.vitz.jfinancemanager2.view;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JTabbedPane;

import de.vitz.jfinancemanager2.controller.IAccountManager;
import de.vitz.jfinancemanager2.view.menu.AccountMenu;

public class GUI extends JFrame {

	private static final long serialVersionUID = 1L;
	private IAccountManager accountManager;
	private JTabbedPane accountPane;

	public GUI(IAccountManager accountManager) {
		// initialize
		super("jFinanceManager2");
		this.accountManager = accountManager;
		accountPane = new JTabbedPane();
		// basic properties
		setLayout(new BorderLayout());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setMinimumSize(new Dimension(400, 200));
		// add components
		setJMenuBar(menuBar());
		add(accountPane, BorderLayout.CENTER);
		// show frame
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	private JMenuBar menuBar() {
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(new AccountMenu(accountPane, accountManager));
		return menuBar;
	}
}

Das Menü zum hinzufügen und löschen von Accounts. Hier stört mich, dass ich sowohl die JTabbedPane als auch den AccountManager brauche. Geht das hier auch anders? Ist es normal, dass die GUI Elemente sich untereinander kennen müssen um die GUI Funktionalität zu bewerkstelligen?
Code:
package de.vitz.jfinancemanager2.view.menu;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;

import de.vitz.jfinancemanager2.controller.IAccountManager;
import de.vitz.jfinancemanager2.view.account.AccountTab;

public class AccountMenu extends JMenu {

	private static final long serialVersionUID = 1L;
	private IAccountManager accountManager;
	private JTabbedPane accountTabs;

	public AccountMenu(JTabbedPane accountTabs, IAccountManager accountManager) {
		super("Accounts");
		this.accountManager = accountManager;
		this.accountTabs = accountTabs;
		add(addAccountItem());
		add(removeAccountItem());
	}

	public JMenuItem addAccountItem() {
		final String title = "Add account.";
		JMenuItem item = new JMenuItem(title);
		item.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String accountName = JOptionPane.showInputDialog(null,
						"Add an account!", title, JOptionPane.DEFAULT_OPTION);
				if (accountName != null && !accountName.equals("")) {
					accountTabs.add(new AccountTab(accountManager
							.createAccount(accountName)));
				} 
			}
		});
		return item;
	}

	public JMenuItem removeAccountItem() {
		final String title = "Remove account.";
		JMenuItem item = new JMenuItem(title);
		item.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				Component component = accountTabs.getSelectedComponent();
				if (component != null
						&& accountManager.removeAccount(component.getName())) {
					accountTabs.remove(component);
				}
			}
		});
		return item;
	}
}

Und zum Abschluss ein einzelner Tab zur Anzeige eines Accounts. Mit dieser Implementierung bin ich eigentlich zufrieden.
Code:
package de.vitz.jfinancemanager2.view.account;

import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JLabel;
import javax.swing.JPanel;

import de.vitz.jfinancemanager2.model.Account;

public class AccountTab extends JPanel implements Observer {

	private static final long serialVersionUID = 1L;
	private Account account;
	private JLabel amountLabel;

	public AccountTab(Account account) {
		super(new BorderLayout());
		this.account = account;
		this.account.addObserver(this);
		setName(account.getName());
		add(header(), BorderLayout.NORTH);
	}

	private JPanel header() {
		JLabel heading = new JLabel(account.getName());
		amountLabel = new JLabel(account.getAmount() + "");
		JButton button = new JButton("Amountchange");
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				account.setAmount(account.getAmount() + 10);
			}
		});
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(heading, BorderLayout.NORTH);
		panel.add(amountLabel, BorderLayout.CENTER);
		panel.add(button, BorderLayout.SOUTH);
		return panel;
	}

	@Override
	public void update(Observable o, Object arg) {
		amountLabel.setText(account.getAmount() + "");
	}
}

Mit freundlichen Grüßen
Michael
 

André Uhres

Top Contributor
Model: Account + AccountManager
View: AccountMenu + AccountTab + GUI
Controller: ?

Der Controller fehlt! Du hast die Kontrollfunktionen in die View verschachtelt (actionPreformed).
 

mvitz

Top Contributor
Danke erstmal, dass hilft mir schonmal extrem weiter. Angenommen ich erstelle nun folgende Klasse:
Code:
package de.vitz.jfinancemanager2.controller;

import java.awt.Component;

import javax.swing.JTabbedPane;

import de.vitz.jfinancemanager2.model.data.Account;
import de.vitz.jfinancemanager2.model.manager.IAccountManager;
import de.vitz.jfinancemanager2.view.account.AccountTab;

public class AccountController {

	private JTabbedPane view;
	private IAccountManager model;

	public AccountController(IAccountManager model, JTabbedPane view) {
		this.model = model;
		this.view = view;
	}

	public void createAccount(String name) {
		if (name != null && !name.equals("")) {
			Account account = model.createAccount(name);
			view.add(new AccountTab(account));
		}
	}

	public void removeAccount() {
		Component component = view.getSelectedComponent();
		if (component != null && model.removeAccount(component.getName())) {
			view.remove(component);
		}
	}
}

und meine Actions aus dem Menü sehen jetzt so aus:
Code:
	...	
		item.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String accountName = JOptionPane.showInputDialog(null,
						"Add an account!", title, JOptionPane.DEFAULT_OPTION);
				controller.createAccount(accountName);
			}
		});
		...

Dann wäre dies ein "richtiger" Controller oder?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX CSS und Vererbung - ich brauche nochmal etwas Nachhilfe AWT, Swing, JavaFX & SWT 28
GilbertGrape nochmal editierbare Combobox AWT, Swing, JavaFX & SWT 3
D Nochmal ne Frage zum DefaultTableModel AWT, Swing, JavaFX & SWT 8
J Nochmal Drag&Drop, ABER: Object verschieben AWT, Swing, JavaFX & SWT 2
S Nochmal Spaltenbriete im Table AWT, Swing, JavaFX & SWT 2
S Nochmal GUI mit JMF Player AWT, Swing, JavaFX & SWT 13
G Nochmal Threads und Einfrieren des GUI :( AWT, Swing, JavaFX & SWT 10
XWing Jave swing overly benutzten. AWT, Swing, JavaFX & SWT 3
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen


Oben