SingleFrameApplication - MainFrame in der ganzen Applikation

Dann schau dir das am besten mal in SWT die Klasse Display an (Methode: getCurrent()/findDisplay(Thread)). Das müsste genau das sein, was du haben willst. Wenn ich dich jetzt richtig verstanden habe
 
Hier mal ein Beispiel-Code:

Die Klasse JWindow:
Java:
import javax.swing.JFrame;

public class JWindow extends JFrame
{
	private final JDisplay display;
	
	public JWindow(String title, JDisplay display) {
		super(title);
		this.display = display;
	}

	/**
	 * @return the display
	 */
	public JDisplay getDisplay() {
		return display;
	}
}
Die Klasse JWindow extendest du bei der jeweiligen Klasse, die dein Fenster beinhaltet. Dann müsste es funktionieren. ;)

Die Klasse JDisplay:
Java:
import java.awt.Window;
import java.util.HashMap;
import java.util.Map;

public class JDisplay
{
	private static Map<Thread, JDisplay> displays = new HashMap<Thread, JDisplay>();
	
	public JDisplay() {
		displays.put(Thread.currentThread(), this);
	}
	
	/**
	 * @return
	 */
	public static JDisplay getCurrent() {
		return displays.get(Thread.currentThread());
	}
	
	/**
	 * @return
	 */
	public JWindow getActiveWindow() {
		final Thread thread = Thread.currentThread();
		final JDisplay display = displays.get(thread);
		
		Window[] windows = JWindow.getWindows();
		if(windows == null) {
			return null;
		}
		
		for(int i = 0; i < windows.length; i++) {
			JWindow window = (JWindow) windows[i];
			if(window.getDisplay().equals(display)) {
				return window;
			}
		}
		return null;
	}
}

Die Klasse JDisplayTest: (zum Testen)
Java:
public class JDisplayTest
{
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JDisplay display = new JDisplay();
		JWindow window = new JWindow("Demo", display);
		window.setTitle("Demo");
		window.setSize(400, 400);
		window.setDefaultCloseOperation(JWindow.EXIT_ON_CLOSE);
		window.setVisible(true);
		
		System.out.println("ActiveWindow="+JDisplay.getCurrent().getActiveWindow().getTitle());
	}
}
 
In deiner Main-Methode kannst du auf JDisplay zugreifen, logisch.

Aber wie würde es so aussehen:


Die Klasse JDisplayTest: (zum Testen)
Java:
public class JDisplayTest
{
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JDisplay display = new JDisplay();
		JWindow window = new JWindow("Demo", display);
		window.setTitle("Demo");
		window.setSize(400, 400);
		window.setDefaultCloseOperation(JWindow.EXIT_ON_CLOSE);
		window.setVisible(true);
		
		Xyz xyz = new Xyz();
	}
}

Java:
public class Xyz()
{
   public xyz()
   {
        Hier möchte ich das mainFrame haben
   }
}

Dass ich der Klasse xyz das JDisplay übergeben kann ist mir schon klar.
Das hier ist nur ein einfaches Beispiel. Die Klasse xyz ist ja viel tiefer, und man müßte dann das JDisplay Object immer mitschleppen.

Da kann ich dann gleich von MainFrame aus der JFrame mitschleppen:)
 
Nein musst du nicht, da wo du das JWindow brauchst, machst du einfach den Aufruf:
Java:
JDisplay.getCurrent().getActiveWindow()
...und das wars.
 
SingleFrameApplication - MainFrame ...

Ich habe jetzt den Rest nicht gelesen. Das ist jetzt die Antwort auf getInstance ohne class-Objekt.
Du bekommst das MainFrame. Du musst nur das ApplicationObject nach SingleFrameApplication casten. So bist du unabhängig von deiner Klasse.

Gruß

Sascha
 
Ja, vielen Dank. Das ist die Lösung:)

Java:
JFrame mainFrame = ((SingleFrameApplication)Application.getInstance()).getMainFrame();
 
Zurück