Swing Wie bekomme ich eine Referenz auf ein Objekt das im EDT erzeugt wird? Und anderes...

P@u1

Aktives Mitglied
Hallo zusammen,
ich habe mal wieder Probleme mit Swing...
Ich habe eben gelesen, dass alles was mit GUI zu tun hat (etwas grob, wenn ihrs genauer wisst wären Erklärungen hilfreich) im Event Dispatcher Thread ausgeführt werden sollte, entweder durch invokeAndWait oder invokeLater.
Jetzt wollte ich eine GUI so in der Art erzeugen:
Java:
private static void createAndShowGUI()
	{
		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{
				JFrame form = new JFrame("blablub");
				form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                             View v = new PlotPanel();
                                             form.add(v);
                                             //ist das so richtig, oder sollte ich besser auf die Contenpane 
                                             //adden und nicht auf das teil direkt?
				form.setVisible(true);
			}
		});
	}

Das Problem ist, dass ich danach die form und v noch brauche.
Ich hatte mir jetzt überlegt, bei Main statische variablen dafür einzuführen und die zu benutzen, was zwar prinzipiell funktioniert, ich aber sehr unschön finde...
Was gibt es für da für gute Alternativen?
Das Problem ist ja, dass ich von InvokeLater keine Rückgabe bekomme.
Außerdem ist im Code noch eine Frage (als Kommentar) zur ContentPane.
Und dann zu guter letzt noch:
Wie sieht es aus mit invokeAndWait oder invokeLater?
Wo prinzipiell der Unterschied ist weiß ich (bei Wait wird solange noch blockiert, bis es fertig ist).
Ich habe aber gelesen, dass man fast immer invokeLater benutzen sollte.
Jetzt ist das bei mir so, dass dieser PlotPanel folgendes Attribut hat, in das ich reinmalen will und beim paintComponent wird dann das BufferedImage auf den Panel gezeichnet:
private BufferedImage offScreenImage;
Wenn ich invokeLater benutze kann es ja passieren, dass das teil noch gar nicht existiert, wenn ich dann nachher dareinzeichnen will...
Wenn ich außerhalb vom EDT auf diese offScreenImage male, sollte das doch unproblematisch sein, oder?
Dann kann es zwar sein, dass paintComponent aufgerufen wird, während das offScreenImage manipuliert wird, das sollte aber eigentlich nicht so schlimm sein, weil eh dauernd neugezeichnet wird, so dass das nicht sonderlich auffallen sollte, wenn "halb veränderte" bilder gemalt werden.
Oder kann es vll sein, dass das irgendwelche anderen Probleme verursachen kann?
Muss ich dieses
private BufferedImage offScreenImage;
dann eigentlich als volatile definieren, da ja dann sowohl der EDT als auch ein anderer Thread darauf zugreifen soll?

Vielen Dank schonmal für eure Hilfe!
 
S

SlaterB

Gast
mal anders gefragt: an wen soll denn zurückgegeben werden, wer kommt 'danach' noch dran?

weiterer normaler Code in der Methode createAndShowGUI()?
durch die Nebenläufigkeit ist die Methode doch längst beendet bevor der Event-Thread sich bequemt, genau dieses Runnable auszuführen,

was immer du weiter machen möchtest kannst du auch einfach in das Runnable hinter Zeile 13 schreiben,
von dort kannst du auch Methoden des umgebenden Objektes aufrufen

wenn du das erzeugte Objekt längerfristig brauchst und statisch nicht gut ist, dann in einem Klassenattribut speichern,
ab wann andere Threads darauf zugreifen können ist aber wie gesagt ungewiss

---

Contentpane oder direkt ist egal
 

P@u1

Aktives Mitglied
Danke für die Antwort.

Wenn ich das Teil in einem Klassenattribut speichern will, also ich nehme mal an du meinst in einem Attribut eines instanzierten Objekts, dann brauche ich sicht auf dieses Objekt, was in der run-Methode aber nicht so ist.
Wenn ich die weiteren Operationen in run machen will, habe ich genau das gleiche Problem, weil ich dafür Sicht aus Sachen für main brauche.
Und eine Referenz auf die Form brauche ich, weil ich später evtl. weitere PlotPanels auf die Form adden will und das geht doch nur, wenn ich noch ein Referenz habe.

Ich beschreibe jetzt mal etwas genauer, was ich vorhabe, vielleicht kannst du mir dann etwas besser helfen.

Am Anfang erstelle ich einen JFrame mit einem PlotPanel drauf.
Außerdem habe ich einen DataGenerator, der nichts direkt mit der GUI zu tun hat, aber eine Referenz auf den Plot panel braucht, weil die generierten Daten dargestellt werden sollen.

Ich möchte das so machen, dass ich zur Laufzeit neue PlotPanels erzeugen kann (z.B. durch einen Button auf dem "add View" oder ähnliches steht oder so) und auch löschen können.
Außerdem kann es sein, dass auch neue Datengeneratoren dazu kommen.
Ein Datengenerator kann eine beliebige Anzahl an views haben.
Ein view stellt aber immer nur die Daten von je einem Generator dar.

Also jetzt wieder zum Anfang: Ich will einen JFrame und einen Plotpanel erstellen und einem DataGenerator, den ich vorher schon erstellt hab den PlotPanel als view hinzufügen.

Dazu rufe ich erstmal createAndShowGUI auf, dass im EDT den JFrame und den PlotPanel erzeugt, dann den PlotPanel zum JFrame hinzufüügt.
Jetzt will ich dem Datagenerator, den ich in Main erzeugt habe diesen PlotPanel als View hinzufügen.
Also brauche ich
-eine Referenz auf den erzeugten PlotPanel in main
oder
-eine Referenz auf den DataGenerator in run

Soweit ich weiß kriege ich solche referenzen nur über statische sachen oder irgendwie noch über final hin, bei final weiß ich nicht genau wie und warum das funktioniert und ob das gut ist.

Also suche ich jetzt einen Weg um dieses Problem möglichst elegant zu lösen und natürlich muss später das hinzufügen oder entfernen von views und Generatoren ohne Probleme möglich sein, also muss ich mir wohl eine Referenz auf den JFrame speichern oder ich muss später bei diesen buttonClick events o.Ä. eine Referenz auf darauf erhalten, falls die dabei irgendwie mitgeliefert wird.

Wie mach ich das ganze jetz am geschicktesten?

Im moment sieht meine Main.java so aus:
(Noch einige Fehler drin)
Java:
public class Main
{
	public JFrame form;
	public PlotPanel v;
	public static void main(String[] args)
	{
		Main main = new Main();
		createAndShowGUI();
		DataGenerator sinus = new DataGenerator(1000);
		Timer dataTimer = new Timer();
		DataTimerTask dataTimerTask = new DataTimerTask(sinus);
		sinus.connect();
		dataTimerTask.addView(main.v);
		dataTimer.scheduleAtFixedRate(dataTimerTask, 0, 5);
	}

	private static void createAndShowGUI()
	{
		try
		{
			SwingUtilities.invokeAndWait(new Runnable()
			{
				public void run()
				{
					main.form = new JFrame("EKG Plot");
					main.form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
					main.form.setVisible(true);
					main.v = new PlotPanel();
					main.form.add(v);
				}
			});
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
Die ganzen Zugriffe beim run auf main funktionieren nicht, weil run dieses Objekt nicht sehen kann, dass muss ich noch irgendwie ändern.
Auch finde ich es unschön Main zu instanzieren, sollte ich vll eine neue Klasse GUI anlegen, die die Elemente der GUI speichert?
Und mir ist auch klar, dass man public nicht verwenden sollte, dass ist nur im Moment so, weil ich erstmal ein funktionierendes Konzept suche.
 
S

SlaterB

Gast
main oder ein anderes Objekt könnte als Parameter an createAndShowGUI() übergeben werden,
wenn als final deklariert, dann ist es im Runnable sichtbar

invokeAndWait(new Runnable()) könnte in einer nicht-statischen Methode ausgeführt werden, dann hat man Zugriff auf die umschließende Instanz

schließlich ist es bestimmt auch denkbar, das JFrame vor dem Runnable zu erzeugen,
ich glaube nur für den setVisible(true);-Aufruf ist das invokeLater() wichtig

auch wichtig in jedem Fall: setVisible(true); erst am Ende aufrufen, danach nichts mehr adden()
 

P@u1

Aktives Mitglied
reicht es, wenn die Paramter als final deklariert sind, aber das übergeben objekt selbst nicht als final deklariert ist?
Und wie meinst du das mit nach setVisible nichts mehr adden, ich will doch später zur Laufzeit noch was adden, dass muss doch gehen, oder?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> reicht es, wenn die Paramter als final deklariert sind, aber das übergeben objekt selbst nicht als final deklariert ist?
es gibt innerhalb der Methode nur den Parameter, was der Aufrufer der Methode vorher oder nachher anstellt ist egal, falls du das meinst

> ich will doch später zur Laufzeit noch was adden, dass muss doch gehen, oder?
später geht gewiss, aber 3 Zeilen später ist ja unnötig

wenn man später etwas hinzufügt empfehle ich die Aufrufe
validate();
repaint();
am JFrame

vergleiche es mit dem Auto:
vor losfahren() sollten alle einsteigen() ;)
was 30 min. später passiert ist ein anderes Thema, aber der direkte Start betrachtet
 

P@u1

Aktives Mitglied
Wenn ich das static wegnehme, kennt er immer noch this.form nicht, möglicherweise weil this jetzt auf das new Runnable() bezieht, oder woran liegt das?

Edit: Hatte noch nen Denkfehler, den ersten Teil meines Posts habe ich also gelöscht.
 
Zuletzt bearbeitet:

P@u1

Aktives Mitglied
danke, funktioniert jetzt.
Wusste gar nicht das das so geht.

Jetzt ist noch die Frage, wie ich das vom Design her am besten mache, noch ne GUI-Klasse, oder doch Main instanzieren, oder sonst noch ne andere gute Lösung?

Edit:
Und noch ne wahrscheinlich relativ einfache Frage:
Wie kann ich eine Kompente (z.B. meinen PlotPanel) wieder entfernen?
Edit2:
Habs schon rausgefunden: Bei dem Container remove aufrufen, genauso wie das adden funktionierte.
Edit3:
Was passiert, wenn ich etwas versuche zu removen, dass gar nicht erst geadded wurde?
Einfach nichts, oder fliegt eine Exception?

Und dann noch zu meiner GUI-Klasse die ich jetzt erstellt hab:
Ich habe jetzt z.B. diese Methode hier erstellt:
Java:
	public void addView(final PlotPanel p)
	{
		views.add(p);
		try
		{
			SwingUtilities.invokeAndWait(new Runnable()
			{
				public void run()
				{
					GUI.this.mainWindow.add(p);
				}
			});
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
Ist das hierfür wirklich notwendig den EDT zu benutzen?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
G AWT Wie bekomme ich einen zeitgesteuerten robot hin? AWT, Swing, JavaFX & SWT 6
T bekomme keinen Focus auf JTextField AWT, Swing, JavaFX & SWT 3
S Bekomme bein Buttonklick das Jtextfield nicht ausgegeben AWT, Swing, JavaFX & SWT 8
Madlip SWT Wie bekomme ich e.getSource xxx AWT, Swing, JavaFX & SWT 2
A Bekomme das Label nicht in die Mitte von Reihe AWT, Swing, JavaFX & SWT 7
L Wie bekomme ich ein Mehrzeiliges JTextField? AWT, Swing, JavaFX & SWT 12
I Swing Wie bekomme ich den Fokus für einen JPanel AWT, Swing, JavaFX & SWT 5
pinerski Swing Wie bekomme ich bei einer JComboBox den Text? AWT, Swing, JavaFX & SWT 2
K bekomme Seitenwechsel nicht hin AWT, Swing, JavaFX & SWT 4
S Hilfe! Bekomme Daten nicht ausgelesen AWT, Swing, JavaFX & SWT 3
V Hilfe :( bekomme textarea nicht versetzt AWT, Swing, JavaFX & SWT 2
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5
I selectedText: Wie bekomme ich Zugriff auf den Text? AWT, Swing, JavaFX & SWT 4
H Bekomme den TreeSelectionListener nicht zum Laufen AWT, Swing, JavaFX & SWT 5
V SWT (JFace): bekomme das FormLayout nicht hin. AWT, Swing, JavaFX & SWT 4
G Wie bekomme ich ein JFrame/JDialog zum Blinken? AWT, Swing, JavaFX & SWT 6
E Wie bekomme ich hier ein vertikale JScrollPane hin?? AWT, Swing, JavaFX & SWT 4
G Bekomme immer: NullPointerException AWT, Swing, JavaFX & SWT 2
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
J Ich kriege eine Fehler Messesage bei meinem Media Player AWT, Swing, JavaFX & SWT 8
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
Lukas2904 Wie speicher ich eine Einstellung? AWT, Swing, JavaFX & SWT 1
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
P Swing Icon einfügen wirft eine Fehlermeldung AWT, Swing, JavaFX & SWT 3
F Variablen an eine Form binden? AWT, Swing, JavaFX & SWT 2
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
Informatiknoob AWT Zahlenraten (eine Zahl zwischen 1 und 10) AWT, Swing, JavaFX & SWT 1
A eine Fehler AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J JavaFX Die Webview stellt eine Webseite nicht dar AWT, Swing, JavaFX & SWT 0
M JavaFX Ein Labeltext eine zeitlang anzeigen dann weiter machen AWT, Swing, JavaFX & SWT 3
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
Thallius Swing JDatePicker oder Sucht jemand eine Aufgabe? AWT, Swing, JavaFX & SWT 0
K Wie kann ich eine Variable zwischen Tab Klassen weitergeben ? AWT, Swing, JavaFX & SWT 7
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
M Wie binde ich eine JavaFX ProgressBar an eine Datei Übertragung? AWT, Swing, JavaFX & SWT 2
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
A JFace Wizard: Ist es möglich eine Page zu löschen? AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
M Combo Box auswahl in eine Datenbank speichern AWT, Swing, JavaFX & SWT 1
M Swing JTextField getText Mehtode übergeben in eine Klasse zu einer Rechnung AWT, Swing, JavaFX & SWT 1
D AWT Das ganze GUI in eine Klasse? AWT, Swing, JavaFX & SWT 1
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
M Über eine JMenuBar überprüfen ob ein JCheckBoxMenuItem selectiert ist. AWT, Swing, JavaFX & SWT 4
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
A JavaFX Eine Task mit einer ProgressBar verbinden AWT, Swing, JavaFX & SWT 0
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen AWT, Swing, JavaFX & SWT 5
G 2D-Slider bzw. eine graphische Auswahlkomponente die sich so verhält AWT, Swing, JavaFX & SWT 6
H Lust auf eine Open-Source Lösung für universelle Java Client-Technologie? AWT, Swing, JavaFX & SWT 11
T Aus JAVA.Jar GUI eine Flash-Datei machen AWT, Swing, JavaFX & SWT 3
S 5 Playlisten eine Skip() AWT, Swing, JavaFX & SWT 4
M SWT Browser nur eine Seite erlauben AWT, Swing, JavaFX & SWT 3
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
I Anhand ButtonGroup eine Auswahl treffen AWT, Swing, JavaFX & SWT 2
B Nach dem Öffnen des Dialogs eine Aktion ausführen. AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben