Swing Große GUI - Konzept, Ideen, Vorschläge

mavinatic

Bekanntes Mitglied
Hallo Community,

für eine JEE-App muss ich eine GUI entwickeln, welches das Administrationsgui unseres Hauptprodukt werden soll.
Da diese GUI, sehr viele Buttons, TextFelder haben wird und beliebig und einfach erweiterbar sein muss, frage ich euch nach einem geeignetem Konzept bzw Herangehensweise an solch ein Projekt.

Wie kann ich eine Klassenstruktur aufbauen, sodass sie schnell wieder erweiterbar ist. Klar wird mein Augenmerk auf Wiederverwendbarkeit liegen. Jedoch ist das meine erste große GUI-App und mit sovielen Buttons und knöpfe, sodass der Quelltext schnell unübersichtlich wird.

Alles soll mit Swing realisiert werden, jedoch können auch Frameworks zu hilfe gezogen werden.

Wie baut ihr aufwendige GUIs auf?

Gruß mavinatic
 

Michael...

Top Contributor
Jedoch ist das meine erste große GUI-App und mit sovielen Buttons und knöpfe, sodass der Quelltext schnell unübersichtlich wird.
Zunächst einmal muss man sich m.M. die Frage stellen sind soviele Köpfchen überhaupt notwendig.
Ich hätte da ein paar Kontaktdaten zur einer Beraterfirma hinsichtlich Syste und Usability ;-) Wobei so eine Adminkonsole muss ja technisch aussehen und schwer bedienbar sein. ;-)
Wie baut ihr aufwendige GUIs auf?
Ich versuche immer Bedienelemente zu funktionalen Gruppen zusammenzufassen und diese in eigene Klassen auszulagern umso komplexerer evtl. wiederverwendbare GUI Komponenten zu erstellen, die ich in der MainGUI einfach nur zusammensetze.
 

Gossi

Bekanntes Mitglied
Ich habe in eigentlich jedem meiner Projekte ein eigenes .util Package, dort kommen dann alle Klassen rein, die einen bei der Verarbeitung der Aufgaben unterstüzen, sowie einen .domain Package für eigene Objeckttypen.

Macht es recht Übersichtlich...

PS:
Und noch nen .repository Package, für alles was mit der DB zu tun hat....


[EDIT]Und ganz wichtig, überleg dir VOR dem Programmieren wie dein Programm aussehen soll[/EDIT]
 
G

Gast2

Gast
Es gibt immer mehrere Aspekte zu betrachten in jedem Layer.
GUI-Schicht
- "Neue" GUI-Controls und Widgets sollte in mehreren Masken wiederverwandbar sein.
- Architektur MVC - MVP - MVA - EventBus

Dann gibt es Transport Layer (Wie werden Objekte zum Server übertragen?), Service Layer (Die ganze BU Logik, evtl. mit Transaktionen, Locking von Objekten), Persistenz Schicht (Wie werden die Daten gespeichert?Filesystem?Datenbank?), Domain/Model Schicht (Dein Klassendiagramm, kann man eventuell generieren lassen usw. siehe EMF), Testfälle(JUnit Test, UI Tests usw.)

Zu jedem Layer oder Layerübergreifend gibt es dann ein oder mehrere Frameworks, Patterns usw.
Abhängigkeiten zwischen Komponenten oder Objekten zu minimieren --> DI

Warum habt ihr euch für Swing entschieden? Oder allgemein für einen RichClient?
 

mavinatic

Bekanntes Mitglied
Wir haben uns für Swing entschieden, weil ich den Vorschlag gebracht habe mit Swing zu arbeiten ;-)

Es soll auf verschiedenen Systemen laufen: MAC-OS-X, Windows, Linux, Solaris, etc...

Ich habe Swing ausgesucht, weil ich kleine GUI's ohne Probleme schreiben kann...aber wenns jetzt 100 Buttons sind, wirds schnell unübersichtlich und deshalb habe ich nach 'nem Rat gefragt.

Unser Dienst besteht aus x-Webservices. Je nach Lizenzmodel, soll nun im AdminGUI-App verschiedene Menüpunkte auftauchen oder nicht und somit verschiedene Funktionen.
 

_Andi91

Bekanntes Mitglied
Da liegt ja schon der Fehler...
Man entscheidet sowas nach einer Pro/Contra Matrix und nicht aus dem Bauch eines Entwickler heraus.

Da is zwar was dran aber generell ist es sicherlich kein Fehler hier auf Swing zu setzen.
Alles was man braucht ist eine gescheites Design der Anwendung.
MVC spielt bei der Entwicklung von Swing Anwendungen hierbei eine große Rolle!!
Man sollte soviel wie möglich abstrahieren und automatisieren. Somit kann man durchaus wartbare und übersichtliche Anwendungen mit Swing programmieren.
So ein Grundgerüst zu schaffen ist allerdings nicht in ein paar Tagen erledigt...
 

bERt0r

Top Contributor
Es gibt ja auch noch das Prinzip teile und herrsche. Wenn du so viele Buttons hast, kannst du die doch sicher in verschiedene Bereiche aufteilen. Wenn ich mir z.B die Admingui eines Routers anschaue, bekomm ich da auch nicht sämtliche Einstellungen auf einer Seite serviert, sondern habe ein Menü, wo ich zwischen Netzwerk- und Wlan-Einstellungen wählen kann. Von einer guten Aufgliederung der Komponenten profitiert auch die Erweiterbarkeit, weil dadurch Schnittstellen besser sichtbar werden.
 
M

maki

Gast
Da is zwar was dran aber generell ist es sicherlich kein Fehler hier auf Swing zu setzen.
Alles was man braucht ist eine gescheites Design der Anwendung.
MVC spielt bei der Entwicklung von Swing Anwendungen hierbei eine große Rolle!!
Man sollte soviel wie möglich abstrahieren und automatisieren. Somit kann man durchaus wartbare und übersichtliche Anwendungen mit Swing programmieren.
So ein Grundgerüst zu schaffen ist allerdings nicht in ein paar Tagen erledigt...
Wenn die Entwickler in Eclipse RCP "fit" sind dann ist es ganz sicherlich ein Fehler auf Swing zu setzen bei diesen Anforderungen.

Wenn die Entwickler nur Swing können und keine Zeit/Lust oder EclipseRCP erfahrenen Kollegen haben, dann ist die Entscheidung einfach, da man keine Optionen hat.
 

mavinatic

Bekanntes Mitglied
Ich kenne mich leider nur mit Swing aus, und da mein Chef meinte, dass es von mir(Azubi) geschrieben werden soll, steht da auch nicht viel Budget dahinter ;-) Von Zeit wollen wir garnicht erst reden :-D

Das ist nun meine Aufgabe mit Swing. Nur habe ich absolut keine Idee wie ich das so professionell wie möglich realisieren soll.

Hier ein Codebeispiel für ein Loginfenster....aber es ist MEGA schlecht meienr Meinung nach:

Wo kann ich es verbessern?
Java:
package com.openflow.designer.gui;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import com.openflow.designer.control.DataController;
import com.openflow.license.service.LicenseService;
import com.openflow.session.service.SessionService;

public class GuiBuilder 
{
	private String[] menuTitles = new String[] {"Datei", "Editieren", "Hilfe"};
	
	private JFrame frame = new JFrame();
	private JPanel mainPanel = new JPanel();
	private JMenuBar menuBar = new JMenuBar();
	private JToolBar toolBar = new JToolBar();
	private JPanel contentPanel = new JPanel();
	private JFrame loginFrame = new JFrame();
	private ButtonListener buttonListener = new ButtonListener();
	private GuiBuilder builder = this;
	private JPanel loginPanel = new JPanel();
	private JTextField txtUser = new JTextField("Admin");
	private JTextField txtPass = new JTextField("Admin");
	private JTextField txtUrl = new JTextField("http://localhost:8080/services");
	private DataController controller = null;
	
	public GuiBuilder() 
	{	
		
	}
	
	/*
	 * Edit
	 */
	public void initMenuBar()
	{
		for(String menuTitle:menuTitles)
		{
			JMenu menu = new JMenu(menuTitle);
			menuBar.add(menu);
		}
		
		frame.setJMenuBar(menuBar);
	}

	public void initMainPanel(String[] buttons) 
	{			
		for(String button:buttons)
		{
			JButton barButton = new JButton(button);
			toolBar.add(barButton);
		}
		
		contentPanel.setLayout(new CardLayout());
		
		mainPanel.setLayout(new BorderLayout());
		mainPanel.add(BorderLayout.PAGE_START, toolBar);
		mainPanel.add(BorderLayout.CENTER, contentPanel);
	}

	public void initLookAndFeel(String lafClass) 
	{
		String lookAndFeelClass = null;

		if (lafClass == null)
			lookAndFeelClass = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

		try {
			UIManager.setLookAndFeel(lookAndFeelClass);
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} catch (InstantiationException e) {

			e.printStackTrace();
		} catch (IllegalAccessException e) {

			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {

			e.printStackTrace();
		}
	}

	public void initWindow() 
	{
		frame.setSize(800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setTitle("Designer");
		frame.add(mainPanel);
		frame.setVisible(true);
	}
	
	public void showLoginScreen()
	{
		loginFrame.setSize(400,325);
		loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		loginFrame.setLocationRelativeTo(null);
		loginFrame.setTitle("login");
		
		loginPanel.setLayout(new BorderLayout());
		
		JPanel imagePanelNorth = new JPanel();
		imagePanelNorth.setLayout(new GridLayout());
		imagePanelNorth.setPreferredSize(new Dimension(400,75));
		imagePanelNorth.setBackground(Color.red);
		
		loginPanel.add(BorderLayout.NORTH, imagePanelNorth);
		
		JPanel iconPanelWest = new JPanel();
		iconPanelWest.setLayout(new GridLayout(1,1));
		iconPanelWest.setPreferredSize(new Dimension(150,120));
		loginPanel.add(BorderLayout.WEST, iconPanelWest);
		
		JPanel dataPanelCenter = new JPanel();
		dataPanelCenter.setLayout(new GridLayout(7,1));
		dataPanelCenter.setBorder(BorderFactory.createTitledBorder("Login"));
				
		dataPanelCenter.add(new JLabel("Benutzername"));
		dataPanelCenter.add(txtUser);
		dataPanelCenter.add(new JLabel("Passwort"));
		dataPanelCenter.add(txtPass);

		dataPanelCenter.add(new JLabel("Server-URL"));
		dataPanelCenter.add(txtUrl);
		
		JPanel buttonPanel = new JPanel();
		JButton button = new JButton("Login");
		button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) 
			{

				JButton button = (JButton) e.getSource();
				if(button.getText().equalsIgnoreCase("Login"))
				{
					controller = new DataController();
					try
					{
						controller.init();
						
						if(controller.pingCheck())
						{
							String[] services = controller.getServices();
							for(String service:services)
							{
								System.out.println(service);
							}
							
							if(controller.login(txtUser.getText(), txtPass.getText()))
							{
								loginFrame.setVisible(false);
								builder.initMenuBar();
								builder.initMainPanel(new String[] {"ServerInfo", "Benutzerverwaltung", "Rechteverwaltung", "Sessionverwaltung"});
								builder.initWindow();
							}
						}
						
					} catch(Exception ex)
					{
						JOptionPane.showConfirmDialog(null, ex.getMessage(), "Error", JOptionPane.CLOSED_OPTION);
						ex.printStackTrace();
					}
				}	
			}
		});
		buttonPanel.add(button);
	
		dataPanelCenter.add(buttonPanel);
		loginPanel.add(BorderLayout.CENTER, dataPanelCenter);
		
		loginFrame.add(loginPanel);
		loginFrame.setVisible(true);
	}

	public static void main(String[] args) {			
		GuiBuilder builder = new GuiBuilder();
		builder.initLookAndFeel(null);
		builder.showLoginScreen();

	}
}
 

bERt0r

Top Contributor
Ja klar, da steckt ja auch null Softwarearchitektur dahinter, was wohl daran liegt das du sowas nie gelernt hast als Azubi. Ihr werdet doch sicher ein Komponentendiagramm für eure Software gemacht haben oder? Nach dem Schema musst du auch die Gui aufteilen. Alles in eine Klasse GuiBuilder zu werfen ist nicht nur höchst unübersichtlich, es ist auch schlecht erweiterbar.
Normalerweise hast du ein Hauptfenster, in das legst du dann z.B ein LoginPanel. Die gestaltung dieses LoginPanels hat im Hauptfenster aber nix zu suchen, das ist eine eigene Komponente und die sollte austauschbar sein.
Der Gedankengang "Ich erstelle eine Klasse die mir eine GUI zusammenbaut" ist einfach nicht OO. Es sollte heissen "Ich erstelle jetzt eine Klasse die meine GUI repräsentiert".

PS: Für Passwörter bietet sich ein JPasswordField an
 

mavinatic

Bekanntes Mitglied
JPasswordField ist mir bekannt, war ja nur aus der Hand heraus :-(

Ich habe echt null peil...wie ich das angehen soll, am besten erstmal'n paar Diagramme ;-)
 
M

maki

Gast
.. da mein Chef meinte, dass es von mir(Azubi) geschrieben werden soll, steht da auch nicht viel Budget dahinter ;-) Von Zeit wollen wir garnicht erst reden :-D
...

Das ist nun meine Aufgabe mit Swing. Nur habe ich absolut keine Idee wie ich das so professionell wie möglich realisieren soll.
...
Dein Chef will das offensichtlich nicht proffessionell gelöst haben oder er ist selber ein "Amateur Chef".
Soll nicht erniedrigend oder sonstwie klingen, aber IME gibt es nur wenige Azubis die sowas schon "proffessionell" draufhaben, sonst wären sie kaum Azubis ;)

Worauf ich hinauswill:
Mach dich locker, lerne soviel du kannst, aber lasse dich nicht übertriebenermassen unter Druck setzen.
 
G

Gast2

Gast
Glaube ich auch dass du als Azubi hier kein perfektes System abliefern musst!!!
Darum learning by doing...

Was für dich interessant sein kann für eine Swing GUI sind:
- Neue libs für widget/layout: swingx, jgoodies
- Architektur für Eventhandling: EventBus, MVC
- Databinding JGoodies
- Evtl.: ein Dockingframework: 10 Free Docking Frameworks for Java | Java By Example | Dock
usw.
Filthy Rich Clients

Oder vielleicht doch was neues lernen, wo das meiste schon dabei ist ;)
- Eclipse RCP Tutorial
- JFace Data Binding - Tutorial
 
Zuletzt bearbeitet von einem Moderator:

mavinatic

Bekanntes Mitglied
Wenn ich auf der SwingX seite auf Binaries klicke....komme ich auf die java.net seite und dort...steht folgende Meldung: "The file /web/projects/swingx/files/documents/2981/153005/swingx-1.6.2-bundle.zip appears to be missing."

Und bei den anderen Versionen auch :-(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
J Swing Große Gui designen/gestalten AWT, Swing, JavaFX & SWT 13
E 2D-Grafik Speicherprobleme große Tiff-Dateien AWT, Swing, JavaFX & SWT 50
J Welche(n) LayoutManager für große Gui? AWT, Swing, JavaFX & SWT 6
G Große dynamische ContextMenus erzeugen (Eclipse RCP) AWT, Swing, JavaFX & SWT 4
R JPanel sehr große JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
T JTable / RowSorter macht große Probleme AWT, Swing, JavaFX & SWT 2
P SWT Button --> große Probleme!! AWT, Swing, JavaFX & SWT 7
D verschieden große Componenten in einem JPanel? AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
C JTree bereitet große Probleme, kann uns bitte jemand helfen! AWT, Swing, JavaFX & SWT 6
J Große Anzahl von Comboboxen in Tabelle darstellen AWT, Swing, JavaFX & SWT 2
H große mengen an jbuttons dynamisch erzeugen? AWT, Swing, JavaFX & SWT 15
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
J Konzept des ActionListeners nicht verstanden AWT, Swing, JavaFX & SWT 3
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
M Datenbericht aus Datenbank darstellen.(einfaches Konzept) AWT, Swing, JavaFX & SWT 2
H Button / Design Ideen AWT, Swing, JavaFX & SWT 2
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
R Low-Res OCR einzelner Buchstaben und mehrstelliger Zahlen - Ideen gesucht AWT, Swing, JavaFX & SWT 2
Kenan89 Ideen AWT, Swing, JavaFX & SWT 5
R SWT Ideen zu Oberflächengestaltung AWT, Swing, JavaFX & SWT 3
M Layout Problem, Ideen gesucht AWT, Swing, JavaFX & SWT 7
A Ideen für eine Filterfunktion von JTable-Einträgen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben