Swing Probleme mit CardLayout

Wang

Bekanntes Mitglied
Hallo,

ich hänge leider mal wieder bei meinem Programm (Bachelorarbeit). Den graphischen Entwurf für den entsprechenden Teil der GUI habe ich fertig und ich weiß, dass ich das CardLayout verwenden muss (Danke EikeB 😉 ), allerdings scheitere ich an der Umsetzung. Der Entwurf:

attachment.php


attachment.php


Ich habe mich unter How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container) mit dem CardLayout vertraut gemacht, aber dort ist die Anforderung wesentlich einfacher...
Meine Basis ist ein JDialog, was sind aber meine "cards" bzw. wie setze ich sinnvoll an?

Bin um jede Hilfe wirklich sehr dankbar!

Gruß
Wang
 
Deine Cards sind JPanels, auf denen Step1 und Step2 angeordnet sind. Beim "Weiterschalten" wählst du dann einfach das andere JPanel (= Card) aus. In deinem JDialog brauchst du noch ein Panel, welchem du das CardLayout setzt und die Cards hinzufügst. Ich würde halt erstmal das Grundkonzept mit dem CardLayout und dem einfachen weiterschalten der Cards umsetzen, und dann das mit der Abfrage der ausgewählten vordefinierten Gruppen einbauen.
 
Mir bereitet das "Continue" noch am meisten Probleme, da beim Einblenden der "Step-2-Card" ja noch der Back-Button erscheinen muss. Irgendwie voll den Blackout gerade...

EDIT:
Danke SirWayne, damit mache ich mich jetzt auf jeden Fall vertraut. 😉
 
Mir bereitet das "Continue" noch am meisten Probleme, da beim Einblenden der "Step-2-Card" ja noch der Back-Button erscheinen muss. Irgendwie voll den Blackout gerade...

Entweder du machst dir die "Back"- und "Continue"-Buttons jeweils auf deine JPanels/Cards mit drauf und kannst dort dann festlegen, wohin das Klicken auf die Buttons führen soll, oder du hast unter dem Panel mit dem CardLayout das Panel mit den Buttons, musst dann aber dir irgendwo "merken", auf welcher Card du gerade bist, welche Buttons dann eingeblendet sein sollen und wohin die führen.
 

Zwei Fragen:
- In der main-Methode des Beispielprogramms wird der Default-Konstruktor aufgerufen. Warum kann man null zum Typ Frame casten ???:L

Java:
public Wizard()
{
	this((Frame) null);
}

public Wizard(Dialog owner)
{
	wizardModel = new WizardModel();
	wizardDialog = new JDialog(owner);
	initComponents();
}

public Wizard(Frame owner)
{
	wizardModel = new WizardModel();
	wizardDialog = new JDialog(owner);
	initComponents();
}

- Eine kleine Frage zum MVC-Pattern: würde es diesem Pattern widersprechen, wenn man im Hauptfenster einen "Open"-Button hat und in dessen "okButtonActionPerformed"-Methode gleich den FileChooser öffnet, oder sollte man den FileChooser besser über den Controller öffnen lassen?

Vielen Dank!
 
1. Weil Frame ein Objekt ist, und jedes Objekt kann man null setzten.
2. Der Actionlistener der deine "okButtonActionPerformed" Methode aufruft ist der Controller. Wenn du den jetzt auslagern möchtest in eine eigene Klasse, du den Code direkt im ActionListener auführst oder so wie du anscheinend eine Funktion deiner View Klasse aufrufst bleibt dir überlassen.
 
1. Weil Frame ein Objekt ist, und jedes Objekt kann man null setzten.

Leider leuchtet es mir noch nicht ein. Wenn dort

Java:
public Wizard()
{
    this(new JFrame());
}

gestanden hätte, wäre es mir klar.
null selbst ist doch eine Referenz, die auf die Konstante null zeigt. Wenn man nun die null-Referenz zu Frame castet, existiert doch noch lange kein Frame-Objekt und man drückt damit nur aus, dass die Referenz nun vom Typ Frame ist und als Wert null hat (sprich: keinen Wert). Warum funktioniert das trotzdem ???:L
 
Weil es das gleiche ist wie this(null). Nur dass der Cast eventuell bei der Auswahl des Konstruktors eine Rolle spielt.
Funktionieren tut das ganze weil dein Konstruktor mit deinem Parameter einen new JFrame(null) erzeugen, und das ist dann eben ein JFrame mit leerem Titel.
 

Ich habe am Programm wegen diverser Klausuren seitdem nicht mehr weiterarbeiten können.

Eine allgemeine Frage zu dem verlinkten Programmcode: Wie geht man vor, wenn man diesen doch etwas größeren Programmcode verstehen möchte (gibt es eventuell ein Plugin für Eclipse, das die Zusammenhänge grafisch darstellt oder führt am "klassischen Lesen" kein Weg vorbei)?

Thanks!

Gruß
Wang
 
Schon klar. Aber wie gehen denn die fortgeschrittenen User hier vor, wenn sie Code analysieren müssen?

Pures Lesen/Notizen mit Papier und Bleistift/spezielle Plugins/... ?

Pickt man sich in meinem konkreten Fall die Klasse mit der main-Methode raus und geht dann Klasse für Klasse mit purem Lesen durch...?

Thanks!
 
Schon klar. Aber wie gehen denn die fortgeschrittenen User hier vor, wenn sie Code analysieren müssen?

Pures Lesen/Notizen mit Papier und Bleistift/spezielle Plugins/... ?

Pickt man sich in meinem konkreten Fall die Klasse mit der main-Methode raus und geht dann Klasse für Klasse mit purem Lesen durch...?

Thanks!

Wenn du gute Entwickler hast sind die Methoden kurz und prägnant. Dann sagt der sprechende Methodenname schon alles aus. Wenn dich dann mehr interessiert, musst du eben die den Code lesen.
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin): Robert C. Martin: 9780132350884: Englische Bücher
 
Gui Code ist immer so ne Sache, aber der Code ist doch einigermaßen gut und an den Methoden erkennt man doch was passiert...
Wo ist das Problem?
 
Gui Code ist immer so ne Sache, aber der Code ist doch einigermaßen gut und an den Methoden erkennt man doch was passiert...
Wo ist das Problem?

Ich brauche da doch etwas mehr Zeit und irgendwie habe ich total die Zweifel bekommen, ob das pure Lesen das Non-Plus-Ultra ist. Aber da muss ich wohl durch, Übung macht ja schließlich den Meister. 🙂
 
Ich brauche da doch etwas mehr Zeit und irgendwie habe ich total die Zweifel bekommen, ob das pure Lesen das Non-Plus-Ultra ist. Aber da muss ich wohl durch, Übung macht ja schließlich den Meister. 🙂

Richtig learning by doing... Und an den Methodennamen erkennt man ja was passiert
 
Leider habe ich noch das folgende Problem. Sobald man die nötigen Einstellungen im Wizard getroffen hat, klickt man auf "Results!" und die Ergebnisse werden im Hauptfenster angezeigt:

draftr.png


Wie bringt man den JFrame dazu, die Anzeige so zu ändern, dass die Ergebnisse angezeigt werden?
Was muss man besonders beachten?

Thanks!
 
Normalerweise gar nichts, höchstens revalidate(). Wie zeigst du die Ergebnisse denn an?

Aller Voraussicht nach sollen im Hauptfenster eine JTable und gleich darunter Tabs zu sehen sein.
Ich habe im Moment wirklich keine Ahnung, wie man das sinnvoll lösen könnte... Hoffe auch, dass ich mein Anliegen gut beschreiben konnte, sonst bitte gerne nochmals nachfragen.

Thanks!
 
Addest du die Table und die Tabs an zu deiner ContentPane oder machst dus mit einem Cardlayout? Ich weis nicht was deine Ergebnisse sind oder sein sollen. Von den Skizzen hab ich nicht viel, zeig code her.
 
Addest du die Table und die Tabs an zu deiner ContentPane oder machst dus mit einem Cardlayout? Ich weis nicht was deine Ergebnisse sind oder sein sollen. Von den Skizzen hab ich nicht viel, zeig code her.

Code dafür gibt es noch nicht, denn das macht ohne ein Konzept hier nicht wirklich Sinn.
Nachdem man im Wizard die Einstellungen gemacht hat (also u.a. maximal 5 user aus der Datenbank ausgewählt hat), soll im Hauptfenster in etwa das folgende Bild mit den Empfehlungen/Ergebnissen erscheinen:

draft2b.png


Es hieß, es soll eine JTable (für die Gruppenempfehlung) sowie Tabs (mit den Einzelempfehlungen für die User) angezeigt werden, denkbar wäre aber auch, dass ich nur JTables verwende. Nun gibt es zwei Punkte:

1.) Wie setzt man das um, dass die Ergebnisse im Hauptfenster überhaupt angezeigt werden, sprich dass die vorherige Anzeige ("Welcome to...") verschwindet und die neue erscheint?
2.) Zu beachten ist auch, dass maximal 5 Einzelempfehlungen erscheinen sollen (je nach individuell getätigter Einstellung im Wizard-Fenster). Sind es nur 4 ausgewählte User dann eben nur 4 Einzelempfehlungen, sprich das Ganze muss dynamisch sein. (*)

(*) Warum das Thema "Gruppenempfehlungen" heißt, gleichzeitig die Gruppe aber nur aus 1-5 User bestehen soll, ist mir ein Rätsel, so wurde es aber vom "Supervisor" vorgegeben. :noe:
 
Am besten mit einem CardLayout. Eine Card ist ein panel mit dem Welcome to, eine Card ist ein Panel wo ein JTable und so weiter drauf ist. In dem Panel mit dem JTable erstellst du eine Methode, z.B setResults, mit der du den Inhalt der Komponenten verändern kannst. Das Panel würd ich dann z.B ResultsPanel nennen.
Wenn jetzt neue Resultate in Form eines Vector results angezeigt werden sollen, musst du nicht ein neues ResultsPanel erstellen, du rufst einfach auf:
Java:
resultsPanel.setResults(results);
cardLayout.show(hauptFrame,"results");
 
Leider habe ich noch das folgende Problem. Sobald man die nötigen Einstellungen im Wizard getroffen hat, klickt man auf "Results!" und die Ergebnisse werden im Hauptfenster angezeigt:

Wie bringt man den JFrame dazu, die Anzeige so zu ändern, dass die Ergebnisse angezeigt werden?
Was muss man besonders beachten?

Du hast doch irgendwo ein Model, welches die results speichert oder?
Wenn sich das Model ändert muss sich dein Hauptfenster neu aktualisieren fertig.
MVC/EventBus gibt es hier beispiele
http://www.java-forum.org/awt-swing-swt/130485-exceptions-mvc.html

Oder aber du hast eine starke kopplung zwischen deinem hauptfenster und deinem wizard und gibst ihm dein hauptfenster mit und rufst am schluss wenn er result drückt hauptfenster.refresh() und in der methode setzte du dann dein TableModel,Felder,Tabs was weiß ich neu...
 
@SirWayne
Ich verwende das MVC design, von daher ist die 1. Alternative gut. Du meinst das aber ohne die Verwendung des CardLayouts oder habe ich dich falsch verstanden?
 
@SirWayne
Ich verwende das MVC design, von daher ist die 1. Alternative gut. Du meinst das aber ohne die Verwendung des CardLayouts oder habe ich dich falsch verstanden?

Das eine hat mit dem anderen nichts zu tun!!!
Tabs verwendest du so
How to Use Tabbed Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
CardLayout so:
How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
 
Mir ist der Unterschied klar.

So wie ich das verstanden habe, gibt es zwei Möglichkeiten:

1.) Ohne CardLayout
Man erzeugt ein neues JPanel inkl. JTable, Tabs oder was auch immer (das ist gar nicht der springende Punkt!) mit den Ergebnissen und übergibt das dem JFrame, welcher für die Anzeige sorgt; gibt es hierfür - also einem bereits existierenden Anzeigefenster ein neues JPanel zu übergeben und darstellen zu lassen - bereits Methoden und falls ja, wie heißen die/falls nein, wie geht man vor?

2.) Mit CardLayout
Trivial.

Warum die ganze Diskussion? Ich möchte einfach nur meinen Horizont erweitern und ganz ehrlich: mir hat das Forum bisher mehr vermittelt als die Uni und ihr Personal. 😉
 
Hallo allerseits,

die Anwendung ist nun so gut wie fertig, mir gefällt nur die Performance noch nicht und es wäre sehr nett, wenn jemand auf mein Anliegen eingehen könnte. 😉

Nochmals eine (kurze) Beschreibung des Programms:
Man startet die Anwendung und es erscheint ein Hauptfenster. Dort befindet sich u.a. ein Button, um den Wizard zu öffnen, in welchem die nötigen Einstellungen getätigt werden können. Im Wizard selbst stehen drei Optionen zur Verfügung (man wählt eine Option aus und clickt auf "NEXT"), wobei in den ersten beiden Optionen im jeweils nächsten Schritt mit einer Datenbank interagiert wird (Microsoft Access; JDBC driver von J-Stels):
In Option 1 wird automatisch der gesamte Inhalt der Datenbank in einer JTable angezeigt und der User kann über entsprechende Kästchen seine Auswahl treffen.
In Option 2 ist die JTable zunächst leer und der User kann über über JComboBoxes die JTable füllen (sobald man in der JComboBox etwas auswählt wird eine SQL-Anfrage gesendet).
Sobald man auf "FINISH" clickt, werden die Ergebnisse berechnet (wobei auch hier mit der Datenbank interagiert wird) und schließlich im Hauptfenster in JTables angezeigt.

So habe ich das umgesetzt:
Startet man das Programm, wird nur der controller, das model und das Hauptfenster (view) initialisiert. Der Datenbanktreiber (also alles was damit verbunden ist) wird nicht geladen und der Wizard wird nicht initialisiert. Dies geschieht erst, sobald der User im Hauptfenster auf den Button clickt, um den Wizard zu öffnen. Genau an dieser Stelle dauert es in etwa 4 Sekunden bis der Wizard erscheint. (1. Problempunkt)
Clickt man auf "FINISH", verschwindet der Wizard und man sieht noch für ca. 2 Sekunden das Anfangsbild (quasi für die Dauer der Berechnung der Ergebnisse), ehe dem Frame bzw. dessen ContentPane ein neues Panel - welches die JTables mit den Ergebnissen beinhaltet - übergeben und dargestellt wird. Genauer: Die view wird vom beobachteten Model, in welchem die Berechnung der Ergebnisse stattfindet, darüber informiert, sobald die Ergebnisse da sind, sodass in der update-Methode die Anzeige des JFrame geändert wird. (2. Problempunkt)

Irgendwelche Ideen/Vorschläge, wie man diese Probleme beseitigen kann?

Vielen Dank für Eure Mühe!!!


Gruß
Wang
 

Zurück
Oben