SWT Wie Objektinstanzen ansprechen?

martin1989

Aktives Mitglied
Hallo!

Ich habe eine SWING Oberfläche die aus mehreren verschachtelten JPanels besteht.

zB.: das hinterste Fenster ist mit dem BorderLayout definiert, in NORTH bereich gibt es ein panel welches ein gridlayout mit 2 spalten und einer zeile hat. In jeder diese spalten ist wiederum ein Panel.

Im center Bereich des hinteresten Fensters ist eine JTabbedPane mit wiederum 2 Panels für 2 Tabs.

Der Übersichthalber habe ich versucht so gut wie allte Panels als eigene Klassen abzubilden.
Nun stellt sich mir die Frage, wie ich die verschiedenen Panels aus den einzelnen Klassen heraus am besten aufrufen/ansprechen soll.

zB Wenn in einem Panel ein Button geklickt wird, soll in einem anderen Panel was angezeigt werden.
Dieses andere Panel wurde schon zu Programmbeginn instanziert, d.h. ich muss ein bestimmtes Objekt ansprechen.

Was mir eingefallen wäre, ist das ich bei der Erzeugung der GUI, wo ja mehere Konstruktoren für jede Klasse aufgerufen werden, jeweils immer die bereits erzeugten Objekte mitgeben.

Andere möglichkeit wäre ich definiere die ganzen Objekte der Panels global (static) und spreche sie immer gleich direkt an.

Wie macht man dies am besten / normalerweise?


Vielen Dank!

LG
 
Zuletzt bearbeitet:

BRoll

Bekanntes Mitglied
Also ich weiß nicht ob dass so der Standard ist, aber wenn ich viele Objekte habe,
die auf viele Daten zugreifen müssen, dann mach ich ein Daten Collection Objekt.
Zb. eine Klasse DataContainer, in der alle komponenten übergeben werden, und über
getter zurückgeliefert werden.
Jede komponente bekommt dann im konstruktor die referenz auf den datacontainer mit.
Sodurch hat man immer nur ein objekt dass man übergeben muss, und wenn man später
zugriff auch mehr braucht muss man auch nichts ändern.
So mach ich das jedenfalls ^^
Der einzige Nachteil den ich sehe, alle haben halt theoretisch zugriff auf alle daten.
Trotzdem finde ich es schöner als alles static zu machen :)
 

Hutzli

Aktives Mitglied
Melde die Controller der Views anhand eines Interfaces als Listener bei den Controllern der Views an, von denen du Informationen benötigst. Das ist um einiges schöner als alle Referenzen in einer Klasse zu speichern.
Dieses Vorgehen setzt natürlich eine gut designte Applikation voraus.

Beispiel:
Java:
public interface IListener
{
     public void okButtonPressed();
}

public class ControllerA implements ActionListener
{
     private List<IListener> mListeners;

     public ControllerA()
     {
          mListeners = new ArrayList<IListener>();
     }

     public void addToListeners( IListener pListener )
     {
          mListeners.add( pListener );
     }

     // Deine ActionPerformed Methode
     public void actionPerformed ( ActionEvent pAction )
     {
          for( IListener lListener : mListeners )
          {
               lListener.okButtonPressed();
          }
     }
}

public class ControllerB implements IListener
{
     @Override
     public void okButtonPressed()
     {
          // Do something
     }
}
 

BRoll

Bekanntes Mitglied
Ja stimmt für GUIs würde ich das auch so machen,
mein Ansatz war jetzt eher für eine Daten-Sammlung wie Bildern oder ähnliches.
 

martin1989

Aktives Mitglied
Irgendwie finde ich das ziemlich verwirrend und kompliziert in Java. Andauernd muss ich irgendwie mit statischen unauberen methoden oder objekten handieren oder die objekte mühselig mitgeben.

Habe hier auch aktuell wieder ein problem:

Habe ein JDialog fenster mit einem button.
Habe die eventbehandlung als anonyme innere methode implementiert.
Ich würed gerne den jdialog bei klicken des buttons wieder auf visible setzen.
nur fehlt mir wie so oft die referenz auf das objekt des jdialogs.
habe schon die statische methode selected() gemacht weil ich die referenzvariable nicht hineinbekomme.
Aber wie setze ich den Jdialog wieder auf visible?

this.setVisible() geht ja nicht, da this ja der button "bd" ist. Kann ich die instanz des jdialogs irgendwie mitgeben oder sollte ich ein eigene klasse für event behandlung machen?


Java:
public Dialog(){

....

        this.setVisible(false);
		
    	        bd.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent arg1){
					
				    
				selected();	
				HIER WÜRDE ICH GERNE den DIALOG wieder auf visible setzen
					
				}});

....



Danke für eure hinweise, ich schau mir das mit den listener mal an ! :)
 

BRoll

Bekanntes Mitglied
Sobald es wegen dem Methodennamen keine Scope-Probleme gibt,
reicht es wenn du setVisilbe(true) schreibst.
(ActionListener hat ja nicht so eine Methode, deshalb wird im Scope
von deinem objekt darüber geschaut, also dem Dialog)

Wenn es die Methoden in beiden Objekten gäbe, musst du es so machen wie Hutzli geschrieben hat.
Damit setzt du den Scope auf dein äußeres Dialog Objekt.
 

martin1989

Aktives Mitglied
es hat einfach funktioniert, wenn ich setVisibile(true) geschrieben haben.

Warum funktioniert den das? :) Wäre "this" hier nicht der Button "bd"?

dankeschön!




Dialog.this.setVisible(true)

hat nicht funktioniert .... was wäre dies für ein Vorgehen?



Vielen Dank Euch!
 

martin1989

Aktives Mitglied
Melde die Controller der Views anhand eines Interfaces als Listener bei den Controllern der Views an, von denen du Informationen benötigst. Das ist um einiges schöner als alle Referenzen in einer Klasse zu speichern.
Dieses Vorgehen setzt natürlich eine gut designte Applikation voraus.

Beispiel:
Java:
public interface IListener
{
     public void okButtonPressed();
}

public class ControllerA implements ActionListener
{
     private List<IListener> mListeners;

     public ControllerA()
     {
          mListeners = new ArrayList<IListener>();
     }

     public void addToListeners( IListener pListener )
     {
          mListeners.add( pListener );
     }

     // Deine ActionPerformed Methode
     public void actionPerformed ( ActionEvent pAction )
     {
          for( IListener lListener : mListeners )
          {
               lListener.okButtonPressed();
          }
     }
}

public class ControllerB implements IListener
{
     @Override
     public void okButtonPressed()
     {
          // Do something
     }
}

hab mir das mal angesehen, gefällt mir ganz gut :)

müsste ich dann nicht noch irgendwie ein Objekt von ControllerB beim IListener anmelden?

zB so:

Java:
ControllerA controllerA = new ControllerA();
controllerA.addToListeners(new ControllerB());

Hab da aber noch eine Frage und zwar will ich ja nicht an neues Objekt vom ControllerB erzeugen (new ControllerB), sondern ein bestehendes (ist in meinem Fall ja direkt zb ein Panel (JPanel panel1 = new JPanel()). Das wurde ja schon mal erzeugt, das heisst ich müsste es so schreiben

Java:
controllerA.addToListeners(panel1);
aber genau da hab ich ja wieder das problem, wie ich dieses objekt in die Klasse ControllerA bekomme?
Wenn ich es zB in einer anderen Klasse erzeugt habe.

Oder lieg ich hier komplett falsch?


Vielen Dank!
 

Hutzli

Aktives Mitglied
Ja, du hast es verstanden ^^
Du musst ControllerB bei ControllerA anmelden ;)

Normalerweise sollte man View und Controller trennen (MVC), aber poste doch mal den entsprechenden Code.
 

martin1989

Aktives Mitglied
ja ich weiß das mit dem trennen von view und controller :) da das aber mein erstes "großes" swing projekt ist wurde mir hier im forum geraten das mit dem MVC konzept noch nicht anzuwenden :)

momentan hab ich ein bisschen einen mischmasch :)

vor allem war es für mich nicht immer leicht zu erkennen, was jetzt wo hingehören würde :)

Mein code sieht eher so aus, das ich für jedes panel eine eigene klasse habe ^^ die dann halt alle von JPanel abgeleitet sind.
Für die JTabellen habe ich dann schon Model Klassen.

Die Controller Klassen habe ich eigentlich alle anonym bei den JPanel Klassen dabei. Also direkt integriert.
Habe es auch mal mit einem externen Controller probiert, hatte da aber sofort wieder das problem, das ich dann in der controller klasse die actionperformed methode hatte, und wenn ich dann dort schreiben wollte "setze panel auf visible" oder irgendwas mit dem panel anstellen wollte, das ich die referenz auf das panel nicht hatte ^^


wenn ich so im nachhinein nachdenke, glaube ich das ich den code für das model vorwiegend in de ganzen panel klassen habe ^^
bis jetzt bin ich mit ein paar statischen listen und dem weitergeben von nur einem panel ganz gut gefahren ....

vll. werde ich das ganze am ende noch versuchen auf ein schönes mvc umzudesignen ....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
Augenblau JavaFX Externe Schriftart über CSS ansprechen und zuweisen AWT, Swing, JavaFX & SWT 5
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
F JTabbedPane bestimmten Tab ansprechen AWT, Swing, JavaFX & SWT 13
X Fenster von außen ansprechen AWT, Swing, JavaFX & SWT 7
R JavaFX TableView - nicht ausgewählte Reihe ansprechen AWT, Swing, JavaFX & SWT 6
D OpenGL ansprechen AWT, Swing, JavaFX & SWT 2
B Swing jnect: Kinect ansprechen AWT, Swing, JavaFX & SWT 5
J Anonyme Klasse - Button ansprechen - Warum muss Button final sein? AWT, Swing, JavaFX & SWT 4
D Bestimmtes JPanel innerhalb eines JTabbedPane ansprechen AWT, Swing, JavaFX & SWT 2
D Swing JList: ScrollPane auf JPanel ansprechen AWT, Swing, JavaFX & SWT 7
B LayoutManager GUI-Design: eventuelle Alternativen zum Verschachteln + Ansprechen von JPanel()? AWT, Swing, JavaFX & SWT 2
N OK-Button in JOptionPane ansprechen AWT, Swing, JavaFX & SWT 5
A Button in Tabelle ansprechen AWT, Swing, JavaFX & SWT 6
J Ansprechen untergeordneter Objekte AWT, Swing, JavaFX & SWT 6
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
F checkboxen auslesen/ansprechen AWT, Swing, JavaFX & SWT 1
M Objekt im ActionListener ansprechen AWT, Swing, JavaFX & SWT 3
S buttons über getSelected ansprechen AWT, Swing, JavaFX & SWT 4
A Drag'n Drop: Absender direkt ansprechen? AWT, Swing, JavaFX & SWT 2
G Bildpixel ansprechen und Farbwerte abfragen AWT, Swing, JavaFX & SWT 4
J JSplitPane Felder ansprechen AWT, Swing, JavaFX & SWT 3
F Checkboxen eines anderen Panels ansprechen AWT, Swing, JavaFX & SWT 3
L Drucker ansprechen unter Java AWT, Swing, JavaFX & SWT 6
S Swing - JFrame ansprechen AWT, Swing, JavaFX & SWT 2
M jLabel per Index ansprechen? AWT, Swing, JavaFX & SWT 8
G Unterschiedliche Textfields ansprechen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben