Wie zur Laufzeit auf Objekte zugreifen

_Andi91

Bekanntes Mitglied
Hi,

ich möchte folgendes machen. Ich hab zB eine Klasse die so aussieht:

Java:
public class Gui
{
	public static void main(String[] args)
	{
		JFrame frame = new JFrame("Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JTextField tf = new JTextField();
		frame.add(tf);
		
		frame.pack();
		frame.setVisible(true);
	}
}

Jetzt möchte ich eine neue Klasse schreiben, vor der aus ich die main Methode der Gui Klasse aufrufe. Und da will ich mir dann sozusagen die JFrame Instanz (frame) raus ziehen.
Wie kann man sowas machen?

Hintergrund ist folgender:
Es gibt (jetzt von Google) das Programm Window Tester. Damit kann man automatisierte Tests für Guis erstellen (JUnit Tests). Der geht anscheined genauso vor.
Ich würde gern selber so ein Test Tool schreiben, weil ich den Window Tester nicht wirklich brauchbar finde.


mfg, Andi
 
Du musst deinen JFrame als public membervariable oben in der klasse initialisieren und nicht innerhalb der main methode
 
um Himmels Willen, du verstehst nicht die einfachsten Grundlagen und willst Test-Tools schreiben?

um an ein von einer Methode erstelltes Objekt zu kommen, lasse dieses z.B. als Rückgabwert zurückgeben,
die main-Methode bietet sich dafür nicht an, aber du kannst ja den Code in eine Methode
> public JFrame createFrame()
auslagern
 
Zuletzt bearbeitet von einem Moderator:
Ich glaube zwar nicht, dass es viel bringt, aber bitte ....

Java:
public class Test {
	public static void main(String[] args) {
		Gui.main(null);
	}
}
 
um Himmels Willen, du verstehst nicht die einfachsten Grundlagen und willst Test-Tools schreiben?

um an ein von einer Methode erstelltes Objekt zu kommen, lasse dieses z.B. als Rückgabwert zurückgeben,
die main-Methode bietet sich dafür nicht an, aber du kannst ja den Code in eine Methode
> public JFrame createFrame()
auslagern

Ich glaube wir reden hier ein bisschen aneinander vorbei.
Ich verstehe sehr wohl die einfachsten Grundlagen 😉
Die Problematik hierbei ist einfach, dass ich den Code nicht anlangen will. D.h. ich will weder eine Methode, die mir ein JFrame zurück gibt noch das JFrame als public Variable oder sonst was deklarieren.


Beim Window Tester sieht das ganze zB einfach nur so aus:

Java:
public class Test extends UITestCaseSwing
{
	/**
	 * Create an Instance
	 */
	public Test()
	{
		super(hka.app.ApplicationMain.class);
	}

	/**
	 * Main test method.
	 */
	public void test() throws Exception
	{
		IUIContext ui = getUI();
		System.out.println(ui.getActiveWindow());
	}
}


D.h. ich übergebe nur die Klasse die meine gui startet.
Und irgendwie wird das JFrame, dass dort in der main instanziiert wird in den IUIContext geschrieben.
Die Frage ist jetzt wie?


Die Ausgabe in dem Fall ist jetzt zB:

Code:
hka.app.CalculatorV[frame0,100,100,334x725,layout=java.awt.BorderLayout,title=Kalkulation,resizable,normal,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,4,30,326x691,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
 
Grundsätzlich kann man "von Außen" nicht auf lokale Variablen zugreifen.
Wenn es dir aber nur um Frames geht, kannst du [c]Frame.getFrames()[/c] verwenden und dir da das passenden JFrame raussuchen. Das erscheint mir vom Konzept aber zweifelhaft. Deine Gui-Klasse sollte schon auch auf Testbarkeit entworfen sein.
 
Ah ok, das schaut ganz gut aus.
Hatte mir jetzt schon selber so ein Konstrukt geschrieben, dass mir alle instanziierten JFrames in eine Singleton Klasse speichert. Aber wenns das eh schon gibt ist es ja ok.
 
noch eine Möglichkeit zeigt
Java:
public class TestGUI  extends JFrame {
    public TestGUI()  {
        setSize(350, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()  {
                public void eventDispatched(AWTEvent event)  {
                    System.out.println(event.getSource());
                }
            }, AWTEvent.COMPONENT_EVENT_MASK);
        new TestGUI();
    }
}
dort bekommt der Listener Events mit, über diesen Wege erhält man allerlei Infos zu GUI-Komponenten
 

Zurück
Oben