Interface Wie schließt man ein anderes JFrame Fenster?

Thomathy

Mitglied
Ich habe alle Grundlagen von Java durch. Nun möchte ich anfangen, ein Programm zu schreiben. Dabei scheitere ich jedoch bereits daran, in Eclipse - WindowBuilder ein Fenster aus einem anderen Fenster heraus zu schließen.
public void close(){ frame.dispose(); }

So, frame kann ich jedoch nicht public static setzen, weil dann alles andere rummeckert. Aber ohne das kann ich von anderswo nicht drauf zugreifen... Die Klasse mit der close() Methode heißt Home. Also müsste man ja eigentlich Home.close(); machen können. Ich kriege es jedoch nicht hin. Wie macht mans dann?

LG Tom
 
Ich kenne mich jetzt mit WindowBuilder nicht gut aus aber du musst ja irgend ein Objekt da haben also z.B.

Java:
Home frame = new Home();

Dann musst du halt auf das Objekt zugreifen also

Java:
frame.dispose();

weiß jetzt nicht ob ich dein Problem richtig verstanden habe oder ob mir nötige Kenntnisse über den WindowBuilder fehlen aber hoffe ich konnte helfen!

LG
 
Es geht mir darum, dass ich auf frame aus einer anderen Klasse zugreifen muss. Und das funzt net so ganz. Nur mit @SuppressWarnings("static-access")

Denn, wenn ich "public static JFrame frame;" setze, kommt, wenn ich in der selben Klasse window.frame.setVisible(true); verwende ein Meldung mit "The static field Home.frame should be accessed in a static way"...
 
Du solltest dich einmal noch etwas mit objektorientierten Design beschäftigen.

Objekte können andere kennen. Und du hast ja einen Ablauf ...
Irgend eine Instanz einer Klasse erschafft eine andere und kann dann da eine Referenz z.B. auf sich selbst hinterlegen.

Dann hat eine Klasse z.B. eine Instanzvariable frameToClose und diese Instanzvariable wird per Konstruktor oder Setter gesetzt.
Und dann kannst du natürlich darauf close() aufrufen.

Zeig etwas mehr von Deinem Code / Aufbau und wir können Dir an Deinem Code zeigen, wie es aussehen könnte.
 
Du solltest dich einmal noch etwas mit objektorientierten Design beschäftigen.

Objekte können andere kennen. Und du hast ja einen Ablauf ...
Irgend eine Instanz einer Klasse erschafft eine andere und kann dann da eine Referenz z.B. auf sich selbst hinterlegen.

Dann hat eine Klasse z.B. eine Instanzvariable frameToClose und diese Instanzvariable wird per Konstruktor oder Setter gesetzt.
Und dann kannst du natürlich darauf close() aufrufen.

Zeig etwas mehr von Deinem Code / Aufbau und wir können Dir an Deinem Code zeigen, wie es aussehen könnte.
Hallo Kneitzel. Danke für deine Antwort!

Mein Code ist folgender, und dabei fast ausschließlich von WindowsBuilder in Eclipse auto-generiert:
Java:
package org.enterfox.org.interfaces;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextField;

import org.enterfox.org.utils.LoginClass;

import javax.swing.JButton;
import javax.swing.JPasswordField;
import java.awt.Label;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Home {
    private JFrame frame;
    private JTextField textField;
    private JPasswordField passwordField;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
           
            public void run() {
                try {
                   
                    Home window = new Home();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
   
    /**
     * Create the application.
     */
    public Home() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 265, 193);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
       
        textField = new JTextField();
        textField.setBounds(10, 36, 229, 20);
        frame.getContentPane().add(textField);
        textField.setColumns(10);
       
        JButton btnNewButton = new JButton("Login");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                LoginClass.login(textField.getText(), passwordField.getPassword());
            }
        });
        btnNewButton.setBounds(138, 123, 101, 23);
        frame.getContentPane().add(btnNewButton);
       
        passwordField = new JPasswordField();
        passwordField.setBounds(10, 92, 229, 20);
        frame.getContentPane().add(passwordField);
       
        Label label = new Label("Password");
        label.setBounds(10, 62, 62, 22);
        frame.getContentPane().add(label);
       
        Label label_1 = new Label("Admin");
        label_1.setBounds(10, 8, 62, 22);
        frame.getContentPane().add(label_1);
    }
}

Und dabei nimmt, soweit ich verstanden habe, JFrame frame dann das Objekt des Fensters an. Mit frame.dispose(); kann man es zumindest schließen. Nun müsste ich ja quasi auf frame zugreifen können. Aber ich schaffe es nicht. Bisher habe ich immer Bukkit Plugins in Minecraft entwickelt. Da konnte man einfach "public static Plugin p;" und im onEnable() dann p = this; festlegen. Aus den anderen Klassen konnte man dann über Main.p.[...] auf Methoden etc. zugreifen, die public static gesetzt waren. Hier ist das ganze irgendwie nicht so einfach. Wohl ein Vorteil daran, dass ich erstmal richtiges Java lerne, ohne auf API basiert zu coden, wo andere mir die Arbeit quasi abgenommen haben.
 
Du solltest dich einmal noch etwas mit objektorientierten Design beschäftigen.

Objekte können andere kennen. Und du hast ja einen Ablauf ...
Irgend eine Instanz einer Klasse erschafft eine andere und kann dann da eine Referenz z.B. auf sich selbst hinterlegen.

Dann hat eine Klasse z.B. eine Instanzvariable frameToClose und diese Instanzvariable wird per Konstruktor oder Setter gesetzt.
Und dann kannst du natürlich darauf close() aufrufen.

Zeig etwas mehr von Deinem Code / Aufbau und wir können Dir an Deinem Code zeigen, wie es aussehen könnte.
Okey, habe es doch geschafft nun. Und zwar so, wie es eigentlich sollte. Hatte da wohl irgendeinen Schusseligkeitsfehler eingebaut.

Meine Lösung:
Java:
public static Home h; //im kopf der klasse definiert
//[..]
h = window; //wenn das window von WindowBuilder definiert wird

//Folgendes als Methode:
public static void closeWindow() {
    h.frame.dispose();
}

//und in der anderen Klasse dann:
Home.closeWindow();

/*Wobei sich das mit "public static Home h = null;""
und dann einer entsprechenden IF-Abfrage, ob Home NULL ist,
feiner erledigen lässt. Denn dann wird ja sicherheitshalber nochmal überprüft, ob
überhaupt ein Fenster offen ist, das geschlossen werden kann.

Keiner mag Exceptions, die nicht geplant sind ;)

*/

Ich sage danke, gebe mir selbst eine Nuss und wünsche noch einen schönen Abend und morgen ein entspanntes Wochenende.

LG Tom
 
Das mag technisch so gehen, aber das ist so nicht sinnvoll!

Ebenso scheint mir dieses Konstrukt nicht wirklich gut zu sein:
Java:
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                LoginClass.login(textField.getText(), passwordField.getPassword());
            }
        });

LoginClass ist eine andere Klasse und login eine statische Methode?

static bitte immer vermeiden, wenn es geht. Es gibt nur wenige Dinge, wo static sein muss oder es Sinn macht. Meist ist es einfach nur ein Zeichen, dass jemand sein Design noch einmal überdenken möchte...

Also erst einmal Code schöner schreiben - es bieten sich Lambdas und Methodenreferenzen an. Also der Code oben mit anonymer Inneren Klasse würde ich umschreiben zu sowas:
[CODE lang="java" title="Code 1.1 umgeschrieben"] btnNewButton.addMouseListener(this::loginAction);
// btnNewButton.addMouseListener(e -> loginAction(e)); // Lambda falls Methodenreferenz nicht zusagen sollte ...

// Dann innerhalb der Klasse noch die Methode

public void loginAction(MouseEvent arg0) {
LoginClass.login(textField.getText(), passwordField.getPassword());
}[/CODE]

Das Statische wird dann direkt umgangen mit z.B. sowas:
Java:
   public void loginAction(MouseEvent arg0) {
       LoginClass loginClass = new LoginClass();
       loginClass.setFrameToClose(frame);
       loginClass.login(textField.getText(), passwordField.getPassword());
   }

LoginClass muss das natürlich dann verstehen und wird dann z.B. so erweitert:
Java:
public class LoginClass {
    
    private Frame frameToClose;
    
    public void setFrameToClose(Frame frame) {
        this.frameToClose = frame;
    }
    
    public void closeOtherWindow() {
        if (frameToClose != null)
            frameToClose.dispose();
    }
}

Dann brauchst Du keine static Variablen oder Methoden mehr (bis auf die main Methode natürlich!)
 

Zurück
Oben