Finden des TOP - Containers

Meru

Bekanntes Mitglied
Hallo,

ist es möglich herauszufinden, welcher Container gerade "on TOP" ist?

Hintergrund ist jener, dass ich ein JFrame habe. Innerhalb des Frames gibt es bestimmte Anwendungen, welche auch einen JDialog öffnen können. Auf dem JDialog können nun Operationen ausgeführt werden, welche durchaus etwas Zeit in Anspruch nehmen. Die Ausführung dieser Operationen ist in einer zentralen Klasse(X) gekapselt. Diese Klasse soll nun den MouseCursor in eine Eieruhr verwandeln.

Das Problem ist, dass die zentrale Klasse X nicht bescheid weiß, wer die Funktion gerade aufruft, also von welchem TOP-Container. Der zentralen Klasse gebe ich aber initial das Frame mit und solange die Operationen auch nur vom Frame (und den Panels, die auf dem Frame liegen) ausgeführt werden, ändert sich der Cursor wie gewünscht.

Gibt es irgendeine Möglichkeit, den aktuellen TOP-Container herauszufinden?

MfG

Meru
 

Meru

Bekanntes Mitglied
Sowas würde ich über Events handeln !!!

Prinzipiell hast du recht, nur müsste ich dann der Aktion ja auch immer den Owner mitgeben bzw., wenn sich ein JDialog öffnet, dann diesen in die zentrale Klasse X bekannt machen und beim Schließen wieder rauskicken. Nur was ist, wenn der Dialog dann auch einen Dialog öffnet und der dann wieder geschlossen wird. Dann müsste sich ja die zentrale Klassen merken, welcher zuvor gesetzt war.
Irgendwie fehlt mir dafür noch die richtige Idee, aber vielleicht muss ein wenig länger darüber nachdenken.


Ansonsten find ich den Hinweis via KeyboardFocusManager ganz gut.

Danke soweit :)
 

Meru

Bekanntes Mitglied

Ist leider doch nicht die optimale Wahl, weil das auch nur dann funktioniert, wenn das Fenster auch irgendwie den Focus hat (ergibt sich ja auch aus dem Klassennamen ;) ). Nun lasse ich ggf ein kleines OptionPane aufpopen ala "wollen sie wirklich 5000000 Datensätze anzeigen?" Nach Ok-klickern geht der OptionPane wieder zu, aber der Dialog hat dann keinen Focus mehr.

Gibt es ggf noch etwas anderes, die TOP-Componente zu finden?
 
G

Gast2

Gast
Prinzipiell hast du recht, nur müsste ich dann der Aktion ja auch immer den Owner mitgeben bzw., wenn sich ein JDialog öffnet, dann diesen in die zentrale Klasse X bekannt machen und beim Schließen wieder rauskicken. Nur was ist, wenn der Dialog dann auch einen Dialog öffnet und der dann wieder geschlossen wird. Dann müsste sich ja die zentrale Klassen merken, welcher zuvor gesetzt war.
Irgendwie fehlt mir dafür noch die richtige Idee, aber vielleicht muss ein wenig länger darüber nachdenken.


Ansonsten find ich den Hinweis via KeyboardFocusManager ganz gut.

Danke soweit :)

hä bahnhof ???:L... Hast du ein Beispiel was du vor hast? Klingt irgendwie nach schlechtem Konzept...
 

Meru

Bekanntes Mitglied
QuellCode kann ich nicht so direkt posten, eher ein wenig pseudoCode.
Na ich versuche mal zu erklären


Die Caller-Klasse ist eine Singelton-Klasse und sie managed alle WebService-Aufrufe. Er nimmt ein CallObjekt entgegen, in dem steht, welcher WebService aufgerufen werden soll. Sinn dieses Callers ist, dass alle WebServices in eine Thread-Warteschleife gepackt werden und einiges anderes mehr. Dies lasse ich mal aus dem unten stehendem PseudeCode raus, da ja alles funktioniert.
Java:
public class Caller{ // Singelton (vereinfachter PseudoCode)

	//..

	public void call(CallObject co){

		// hier will ich nun, dass der TOP-Container den WartenCursor bekommt
		try{
			Object response = co.call(); // es wird der WebService aufgerufen, der ein wenig dauern kann  
			co.callSuccess(response);
		}catch (Exception e){
			co.callFailed();	
		}
		// hier soll der Warte-Cursor wieder zurückgesetzt werden
	}
}


So, nun habe ich ein normales JFrame. Auf diesem JFrame laufen verschiedene Programme (Module). Beispielsweise könnte es ein Modul "Administration" oder "Verkauf" geben.
Diese Module, und ihre Masken, stelle ich nun auf dem JFrame dar.
Zu den Masken stelle ich ergänzend auch gewisse Übersichten bereit, die ich in einem JDialog aufpoppen lasse. Um jedoch die Übersichten anzeigen zu können, muss ich erst einmal einen Call absetzen und mir diese Informationen besorgen. Während dessen ist der JDialog schon geöffnet und wartet auf die Daten. Nun soll aber während des Wartens der Cursor geändert werden damit man sieht, dass noch etwas im Gange ist (JProgressbar würde auch gehen, aber das ist hier nicht das Problem und an der Stelle wird bewusst darauf verzichtet).
Zu jedem Modul habe ich einen Controller, der mir Actions (Kleine Erweiterung zu AbstractAction) definiert. Es werden da wirklich nur nackte Actions definiert, damit ich diese nehmen kann um sie entweder an einen Button oder JMenuItem oder oder oder ranhängen kann. Dadurch erspare ich mir doppelte ActionListener oder aber ich kann eine Action deaktivieren und alle Components, die diese Action im Bauch haben, werden dann automatisch disabled etc etc.
In der Action selbst habe ich quasi auch das CallObject zusammengebaut, welcher dann via "actionPerformed" abgesetzt wird.

So, jetzt habe ich also Actions an zentraler Stelle definiert und 2 Buttons, an denen ich diese anhänge. Jetzt ist ein Button auf einer normalen Maske innerhalb des JFrames und der andere ist auf dem Übersichts-Dialog.

Nun soll während des Calls der Cursor geändert werden. Da ich aber nun nicht weiß, von wo der Call kam, also von dem Button auf dem JFrame oder von jenem, welchen ich auf den JDialog platziert habe. Anhand der AbstractAction und dessen actionPerformed komme ich nicht ran.
Daher die Idee, dass der Caller den Cursor für jenen Container ändern soll der ganz vorne auf dem Bildschirm ist.


Ich hoffe, dass ich das Problem und die Struktur halbwegs gut darlegen konnte, wenn nicht, einfach noch einmal fragen ;)

Wenn jemand eine gute Idee hat, wie ich das halbwegs "sauber" realisieren kann, immer her damit, würde mich freuen.


MfG

Meru
 

Niki

Top Contributor
du bekommst ja beim ActionEvent die Source mit. Hiermit müsstest du den TopContainer heraus finden:

Java:
JButton comp = (JButton)e.getSource();
Container cont = comp.getParent();
Window w = null;
while(w == null){					
	if(cont instanceof JDialog || cont instanceof JFrame)
		w = (Window)cont;
	else
		cont = cont.getParent();
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
S Punkt finden der in einem Shape liegt..? AWT, Swing, JavaFX & SWT 11
S JList Index finden AWT, Swing, JavaFX & SWT 6
A AWT TTF-Datei zu Font-Objekt finden? AWT, Swing, JavaFX & SWT 5
R Bild in Bild finden AWT, Swing, JavaFX & SWT 4
propra Schnittpunkt zwischen Objekt und Kante finden AWT, Swing, JavaFX & SWT 24
M GEF tutorial Fehler finden AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Markantesten Bildpunkte finden! AWT, Swing, JavaFX & SWT 8
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
L Swing Auslöser eines Events finden? AWT, Swing, JavaFX & SWT 6
A wie heisst dies, und wo kann ich es finden? AWT, Swing, JavaFX & SWT 7
B Swing Passendes Layout finden: Welche Klassen muss ich wie anwenden? AWT, Swing, JavaFX & SWT 8
7 SWT-Composite für Wizard, Event finden? AWT, Swing, JavaFX & SWT 5
G Component "finden" AWT, Swing, JavaFX & SWT 6
philipp Ändern des Inhalts eines Containers nicht möglich AWT, Swing, JavaFX & SWT 2
T Breite des Containers ist gegeben - wie die Höhe berechnen? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben