JavaFX Exception Message von Model Class via Controller in View darstellen

ralfb1105

Bekanntes Mitglied
Hallo,
ich habe eine grundsätzliche Frage zu Exceptions in Verbindung mit einem JvaFX GUI welches ich versuche nach dem MVC Pattern zu erstellen.
In diesem Forum habe ich ja bereits gelernt das in in meiner Model Class keinerlei FX Komponenten haben sollte, diese werden im Controller behandelt um dann im View, sprich GUI, ausgegeben/dargestellt zu werden.
Nun muss ich zugeben das ich mich als Anfänger bis dato wenig mit Exceptions beschäftigt habe, nur das grundlegende, wie z.B. try/Catch Block etc.
Nun habe ich folgende Problematik. Ich habe ein kleines GUI welches eine Verbindung zu einer Datenbank herstellt/testet, Informationen abfragt, diese im GUI darstellt und ggf. noch bei hergestellter Verbindung SQL Kommandos absetzt. Ich habe eine Controller Class und ein main.fxml(View) mit einigen Feldern und einer TextArea in dem ich Meldungen etc. ausgeben möchte. Dann habe ich eine Klasse DB.class in der die Verbindung zur DB hergestellt wird.
Hier mal in Auszügen der Code um den es sich handelt:
DB.class (komplett)
Java:
package application;

import java.sql.Connection;
import java.sql.DriverManager;

import oracle.jdbc.OracleDriver;

public class DB {

    // Fields

    // Constructor

    public DB() {

    }

    // Methods

    // Create a database connection using jdbc and provided connection string and
    // user/password information
    public Connection dbConnect(String dbConnectString, String dbUserId, String dbPassword) {
        try {
            DriverManager.registerDriver(new OracleDriver());

            Connection conn = DriverManager.getConnection(dbConnectString, dbUserId, dbPassword);
            if (conn != null) {
                return conn;
            } else {
                return null;
            }
        } catch (Exception ex) {
            String msgException = String.valueOf(ex);
            System.out.println(msgException);
            return null;
        }
    }
}
Dann der Code aus der Controller Klasse - hier nur der Teil von dem ich denke das er für die Erklärung relevant ist:
Java:
@SuppressWarnings("rawtypes")
    Service serviceWorkerConnectDB = new Service() {

        @Override
        protected Task createTask() {
            return new Task() {
                @Override
                protected Void call() throws Exception {
                    // Start enetering execution code here ...
                    updateMessage("Task1: Check if ojdbc driver is available.");
                    LOGGER.info("Task1: Check if ojdbc driver is available.");
                    if (model.checkForJdbc()) {
                        updateMessage("Task1: Success.");
                        LOGGER.info("Task1: Success.");
                    } else {
                        updateMessage("Task1: Failed!");
                        setFadeTransitionLabelErrorStatus(true);
                        connectDB.setDisable(false);
                        serviceWorkerConnectDB.cancel();
                    }
                    updateMessage(
                            "Task2: Try database connection using: " + getConnectString() + " as user: " + dbSysUser);
                    LOGGER.info("Task2: Try database connection using: " + getConnectString() + " as user: " + dbSysUser);
                    Connection connSys = db.dbConnect(getConnectString(), dbSysUser, dbSysUserPassword.getText());
                    try {
                        jdbcInfo.setText("");
                        jdbcInfo.appendText("Java Version: " + System.getProperty("java.version") + "\n");
                        DatabaseMetaData metaData = connSys.getMetaData();
                        jdbcInfo.appendText("JDBC Driver Version: " + metaData.getDriverVersion() + "\n");
                        LOGGER.info("JDBC Driver Version: " + metaData.getDriverVersion());
                        updateMessage("Task2: Success.");
                        LOGGER.info("Task2: Success.");
                        updateProgress(1.0, 1.0);
                        connectDB.setDisable(false);
                    } catch (Exception ex) {
                        String msg = String.valueOf(ex);
                        updateMessage(msg);
                        setFadeTransitionLabelErrorStatus(true);
                        connectDB.setDisable(false);
                        serviceWorkerConnectDB.cancel();
                    }

                    // End entering execution code here ...
                    return null;
                }
            };
        }
    };
In diesem Task wird die Verbindung zur Datenabk hergestellt:
Java:
Connection connSys = db.dbConnect(getConnectString(), dbSysUser, dbSysUserPassword.getText());

DatabaseMetaData metaData = connSys.getMetaData();
Das funktioniert auch soweit wi ich mir das vorstelle, wenn ich korrekte Daten angebe und die DB verfügbar ist.
Nun zu meiner Frage:
Kommt es in der Klasse DB zu einem Problem, falsche DB SID, kann DB nicht erreichen, etc. wird z.B. eine SQL Exception geworfen. Diese gebe ich zur Zeit auf der Console aus.

Wie bekomme ich die Exceptions die in der DB Klasse geworfen werden in meiner TextArea angezeigt? Sprich wie kann der Controller auf diese Meldungen zugreifen um diese dann über z.B.
Java:
updateMessage(msgExceptionClassDB);
in meiner Message Area anzuzeigen.

Bevor ich mich mit JavaFX und MVC beschäftigt habe, war meine Lösung der DB Klasse das TextArea Objekt mizugeben damit von dort darein geschrieben werden kann.
Das soll ja aber mit MVC nicht so sein wenn ich es richtig verstanden habe??

Kann mir jemand hier helfen um eine korrekte Implementation im Sinne von MVC hin zu bekommen?

Gruß
Ralf
 

Robat

Top Contributor
Anstatt die Exception in der Methode zu behandeln kannst du sie auch mit dem throws Keyword an die aufrufenden Methode weitergeben.
Java:
public void connect() throws SQLException {
    ... 
}
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
da ich wie geschrieben sehr wenig Erdahrung mit Exceptions habe muss ich hier noch etwas genauer nachhaken da ich es noch nicht ganz verstanden habe. Bezogen auf mein Beispiel von oben, muss ich die Methode
Java:
public Connection dbConnect(String dbConnectString, String dbUserId, String dbPassword)
aus der Klasse DB ändern, sprich darin den try/catch Block entfernen und dann beim Aufruf der Methode im Controller das ganze mit einem try/catch Block abfangen?
Wäre das theoretisch, ohne jetzt im Moment genau zu wissen wie ich das zu coden hätte, der Ansatz?

Vielleicht kannst Du mir ein paar Zeilen Code als Hilfe schicken - bezogen auf mein Beispiel :)
Gruß
Ralf
 

Robat

Top Contributor
Ja genau. Durch den try-catch Block behandelt du die Exception ja, sagst also was im Fehlerfall passieren soll. Das willst du aber nicht. Du willst den Fehler erst in der aufrufenden Klasse behandeln, in deinem Fall ist das der Controller.

Ein bisschen Pseudocode (bin gerade am Handy)
Java:
class Database {
    public void connect(...) throws SQLException {
       ....
    }
}
class Controller {
    @FXML Label label;
    public void handleSomething() {
        try{
            new Database().connect();
       } catch (SQLException e) {
            label.setText("Ein Fehler beim Verbindungsaufbau..."); // wahlweise Stacktrace ins Label schreiben
       }
    }
}
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
Danke schon mal für Deine Hilfe und Infos. Ich werde mal probieren wie weit ich komme und melde mich dann hier noch einmal mit SUCCESS oder ggf. weiteren Fragen :rolleyes:
Gruß
Ralf
 

mihe7

Top Contributor
Mal abgesehen vom try-catch und unabhängig von der DB: das Model kennt Schnittstellen, um mit Views zu kommunizieren. Eine Implementierung (oder auch mehrere) der Schnittstelle wird beim Model registriert und das Model informiert über diese Schnittstelle wen auch immer. Du kannst also einfach eine solche Schnittstelle anbieten. Der Punkt gegenüber dem try-catch ist dabei, dass nicht unbedingt (nur) der Aufrufer informiert werden muss.

Zum Thema DB: die Datenbank ist ein Implementierungsdetail. Davon sollten im besten Fall weder Controller noch View Kenntnis haben. Selbst die unmittelbaren Modelklassen (Fassaden auf den Kern Deiner Anwendung) sollten davon verschont bleiben.
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
ich habe den Code nun wie folgt geändert und kann die Exception Meldungen nun über den Controller in der TextArea anzeigen:

DB1.java
Java:
package application;

import java.sql.Connection;
import java.sql.DriverManager;

import oracle.jdbc.OracleDriver;

public class DB1 {

    // Fields

    // Constructor

    public DB1() {

    }

    // Methods

    // Create a database connection using jdbc and provided connection string and
    // user/password information
    public Connection dbConnect(String dbConnectString, String dbUserId, String dbPassword) throws Exception {
        DriverManager.registerDriver(new OracleDriver());
        Connection conn = DriverManager.getConnection(dbConnectString, dbUserId, dbPassword);
        if (conn != null) {
            return conn;
        } else {
            return null;
        }
    }
}

Controller.java - Aufruf der DB1 Methode un mit Try-catch Block:
Java:
try {
                        Connection connSys = db.dbConnect(getConnectString(), dbSysUser, dbSysUserPassword.getText());
                        DatabaseMetaData metaData = connSys.getMetaData();
                        ....
                        updateMessage("Task2: Success.");
                        LOGGER.info("Task2: Success.");
                        ....
                    } catch (Exception ex) {
                        updateMessage("Task2: Failed!");
                        LOGGER.severe("Task2: Failed!");
                        String msg = String.valueOf(ex);
                        LOGGER.severe(msg);
                        updateMessage(msg);
                        ...
                    }

Ich hoffe mal das ist so wie von Dir beschrieben?
Gruß
Ralf
 

ralfb1105

Bekanntes Mitglied
Hallo mihe7,
Danke für Deine Infos zu MVC und meinem Projekt. Allerdings hast Du mich teilweise etwas abgehängt, da ich aber das Gefühl habe das Deine Antworten für mein Verständnis zum MVC und was da dran hängt essentiell sind, habe ich noch ein paar Fragen und hoffe Du findest die Zeit mit mir darüber zu diskutieren bis bei mir auch der letzte Groschen gefallen ist ;)
das Model kennt Schnittstellen, um mit Views zu kommunizieren. Eine Implementierung (oder auch mehrere) der Schnittstelle wird beim Model registriert und das Model informiert über diese Schnittstelle wen auch immer. Du kannst also einfach eine solche Schnittstelle anbieten.
Könntest Du mir dazu bitte etwas mehr im Detail schreiben wie genau so etwas zu implementieren ist? Es hört sich sehr logisch und interessant an und daher würde ich es gerne im detail verstehen.
die Datenbank ist ein Implementierungsdetail. Davon sollten im besten Fall weder Controller noch View Kenntnis haben. Selbst die unmittelbaren Modelklassen (Fassaden auf den Kern Deiner Anwendung) sollten davon verschont bleiben.
Was genau meinst Du mit dieser Aussage? In meinem Beispiel habe ich die DB Klasse (s.o.). Die Methode zum herstellen der Verbindung rufe ich im Controller auf. Widerspricht das schon dem Modell? Wenn ja, wo und wie sollte ich meine DB Klasse implementieren und aufrufen?

Wie Du sicher merkst habe ich bzgl. MVC noch nicht alles zusammen, bin also für jede Art von Aufklärung dankbar.

Gruß
Ralf
 

mihe7

Top Contributor
@ralfb1105 ich beantworte Deine Fragen in mehreren Posts, sonst werden die einzelnen zu lange :)

Könntest Du mir dazu bitte etwas mehr im Detail schreiben wie genau so etwas zu implementieren ist? Es hört sich sehr logisch und interessant an und daher würde ich es gerne im detail verstehen.

Sagen wir mal, Dein Model möchte der "Außenwelt" mitteilen, dass eine Exception aufgetreten ist. Dann bietet das Model eine Schnittstelle dafür an, z. B.
Java:
public interface ExceptionListener {
    void exceptionOccurred(Throwable th);
}
Deine Model-Klassen können nun über diese Schnittstelle kommunizieren. Dazu muss das betreffende Objekt natürlich wenigstens eine entsprechende Implementierung der o. g. Schnittstelle kennen. Die Klasse muss also die Möglichkeit bieten, einen solchen Listener zu registrieren. Mit Code dürfte das einfacher zu verstehen sein:
Java:
public class MyXYZModel {
    private ExceptionListener exceptionListener;

    public void registerExceptionListener(ExceptionListener l) {
         exceptionListener = l;
    }

    private void fireException(Throwable th) {
        if (exceptionListener != null) {
            exceptionListener.exceptionOccurred(th);
        }
    }

    public void doSomething() {
        try {
            ...
        } catch (Exception ex) {
            fireException(ex);
            // weitere Behandlung, falls gewünscht
        }
    }
}

Wenn jetzt im Model (d. h. hier nur mal in doSomething()) eine Exception auftritt, wird der registrierte Listener informiert.

Nun kann z. B. die View/Controller (das ist je nach MVC-Variante unterschiedlich) einen entsprechenden Listener registrieren:
Java:
    model.registerExceptionListener(new ExceptionListener() {
        @Override
        public void exceptionOccurred(Throwable th) {
            // behandle die Exception, z. B. mit einem Popup
            // oder ggf. auch einfach nur:
            label.setText("Ooops: " + th.getMessage());
        }
    });
 

ralfb1105

Bekanntes Mitglied
Hallo mihe7,

erst einmal vielen Dank das Du es mir so ausführlich erklärt und dann auch noch mit Code ausgeführt hast - ohne den Code hätte ich es vermutlich nicht verstanden.
Ich habe zum testen mal in meiner DB Klasse folgendes implementiert:
Java:
package application;

import java.beans.ExceptionListener;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.jdbc.OracleDriver;

public class DB {

    // Fields
    private ExceptionListener exceptionListener;

    // Constructor

    public DB() {

    }

    // Methods

    public void registerExceptionListener(ExceptionListener l) {
        exceptionListener = l;
    }

    private void fireException(Throwable th) {
        if (exceptionListener != null) {
            exceptionListener.exceptionOccurred(th);
        }
    }

    public Connection dbConnect(String dbConnectString, String dbUserId, String dbPassword) {
        try {
            DriverManager.registerDriver(new OracleDriver());
            Connection conn = DriverManager.getConnection(dbConnectString, dbUserId, dbPassword);
            return conn;
        } catch (Exception ex) {
            fireException(ex);
            return null;
        }
    }
}

Leider gibt mir Eclipse aber einen Fehler bei:
Java:
exceptionListener.exceptionOccurred(th);
der Fehler lautet:
Code:
The method exceptionOccurred(Throwable) is undefined for the type ExceptionListener

Wenn ich mir die Methoden über die Punkt Notation in Eclipse anschaue ist auch keine Methode exceptionOccurred() dabei?

Habe ich etwas übersehen?
Gruß
Ralf
 

ralfb1105

Bekanntes Mitglied
Hallo mihe7,

ich habe die Methode fireExcpetion() in der DB Klasse wie folgt abgeändert:
Java:
private void fireException(Exception  ex) {
        if (exceptionListener != null) {
            exceptionListener.exceptionThrown(ex);
        }
    }
also den Datentyp Throwable in Exception geändert. Damit wird in Eclipse in der Klasse kein fehler mehr angezeigt.

Nun kommen wir zu dem Code im Controller. An welcher Stelle muss/ kann ich denn den ExceptionListener registrieren?

Ich habe das mal im Konstruktor des Controller gemacht:
Java:
db.registerExceptionListener(new ExceptionListener() {
            @Override
            public void exceptionThrown(Exception ex) {
                messageTextArea.appendText(ex.getMessage() + "\n");
            }
        });
Wäre das an der Stelle OK?

Dann habe ich den Service Task des Cobntroller wie folgt geändert:
Java:
@SuppressWarnings("rawtypes")
    Service serviceWorkerConnectDB = new Service() {

        @Override
        protected Task createTask() {
            return new Task() {
                @Override
                protected Void call() throws Exception {
                    // Start enetering execution code here ...
                    jdbcInfo.setText("");
                    updateMessage("Task1: Check if ojdbc driver is available.");
                    LOGGER.info("Task1: Check if ojdbc driver is available.");
                    if (model.checkForJdbc()) {
                        updateMessage("Task1: Success.");
                        LOGGER.info("Task1: Success.");
                    } else {
                        updateMessage("Task1: Failed!");
                        LOGGER.severe("Task1: Failed!");
                        setFadeTransitionLabelErrorStatus(true);
                        connectDB.setDisable(false);
                        serviceWorkerConnectDB.cancel();
                    }
                    updateMessage(
                            "Task2: Try database connection using: " + getConnectString() + " as user: " + dbSysUser);
                    LOGGER.info(
                            "Task2: Try database connection using: " + getConnectString() + " as user: " + dbSysUser);
                    Connection connSys = db.dbConnect(getConnectString(), dbSysUser, dbSysUserPassword.getText());
                    if (connSys == null) {
                        updateMessage("Task2: Failed!");
                        LOGGER.severe("Task2: Failed!");
                        setFadeTransitionLabelErrorStatus(true);
                        connectDB.setDisable(false);
                        serviceWorkerConnectDB.cancel();
                    }
                    jdbcInfo.appendText("Java Version: " + System.getProperty("java.version") + "\n");
                    DatabaseMetaData metaData = connSys.getMetaData();
                    jdbcInfo.appendText("JDBC Driver Version: " + metaData.getDriverVersion() + "\n");
                    LOGGER.info("JDBC Driver Version: " + metaData.getDriverVersion());
                    updateMessage("Task2: Success.");
                    LOGGER.info("Task2: Success.");
                    updateProgress(1.0, 1.0);
                    connectDB.setDisable(false);
                    // End entering execution code here ...
                    return null;
                }
            };
        }
    };
Es gibt also kein try-catch Block mehr, die Exception wird über die DB Klasse und dem ExpectionListener angehandelt.
Meine ersten Tests waren so wie mit der Lösung von Robat, die Exceptions die die DB Klasse wirft werden in der TextArea angezeigt.

Mir gefällt die Lösung so ganz gut, welche wäre denn aus Eurer Sicht mit Blick auf MVC die bessere?

Gruß

Ralf
 

mihe7

Top Contributor
also den Datentyp Throwable in Exception geändert. Damit wird in Eclipse in der Klasse kein fehler mehr angezeigt.
Mit dem Typ hat das nichts zu tun (Exception ist eine Subklasse von Throwable). Du hast im Listener den Methodennamen offensichtlich von exceptionOccurred nach exceptionThrown geändert, in fireException dann aber exceptionOccurred aufgerufen :)

Wäre das an der Stelle OK?
Ich habe nur die halbe Wahrheit geschrieben, um das Prinzip zu verdeutlichen. Du musst die Registrierung des Listeners nämlich irgendwo auch wieder aufheben, ansonsten wirst Du ggf. weiter über den Listener informiert, obwohl die View längst geschlossen ist.

Normalerweise registriert man die View beim Model (über solche Interfaces) und hebt diese Registrierungen wieder auf, wenn sie nicht mehr benötigt werden, i.d.R. spätestens, wenn die View geschlossen wird. Wo man das in JavaFX am besten macht, weiß ich nicht. @Robat?

Mir gefällt die Lösung so ganz gut, welche wäre denn aus Eurer Sicht mit Blick auf MVC die bessere?
Besser gibt es in dem Sinn nicht. Man kann danach beurteilen, ob etwas geeignet ist.
 

Robat

Top Contributor
Man könnte die stop-Methode in der Main-Klasse (welche von Application erbt) überschreiben.
Java:
@Override
public void stop(){
   ...
}
Man könnte sich im Controller auch die Stage holen und einen EventHandler fürs Schließen implementieren..
Java:
stage.setOnCloseRequest((WindowEvent event1) -> {
       ...
});

BTW:
Nur um noch eine andere alternative zu nennen: JavaFX bietet diese Möglichkeit des Observer-Patterns ja bereits. Siehe dazu JavaFX Properties.
 

mihe7

Top Contributor
Was genau meinst Du mit dieser Aussage? In meinem Beispiel habe ich die DB Klasse (s.o.). Die Methode zum herstellen der Verbindung rufe ich im Controller auf. Widerspricht das schon dem Modell? Wenn ja, wo und wie sollte ich meine DB Klasse implementieren und aufrufen?
Pauschale Aussagen sind immer schwierig, weil es natürlich von der jeweiligen Anwendung abhängt.

Nehmen wir als Beispiel mal die klassische Adressverwaltung. Nach dem Aufruf der Anwendung können Adressbücher angelegt, in den Adressbüchern die Kontakte verwaltet werden usw.

Es kann sein, dass jedes Adressbuch als Datei gespeichert wird. Es kann sein, dass alle Adressbücher in einer relationalen DB gespeichert werden. Es könnte auch sein, dass alles im Hauptspeicher gehalten wird (für Tests). Das ist für die Funktionsweise der Anwendung selbst aber (vom Prinzip her) irrelevant, weshalb so etwas als Implementierungsdetail zählt.

Man kann so etwas - wieder - über Schnittstellen entkoppeln. Zum Beispiel:
Java:
interface AddressBookRepository {
    void add(AddressBook book);
    void remove(AddressBook book);
    void update(AddressBook book);
    List<AddressBook> findAll();
}
Gegen diese Schnittstelle kann Dein Model dann arbeiten:
Java:
public void createAddressBook(String name) {
    getRepository().add(new AddressBook(name));
}
Der Controller kann dann aufrufen:
Java:
@FXML
public void handleAddAction(ActionEvent e) {
    model.createAddressBook(addressBookName.getText());
}
Für Tests (oder um die Entwicklung anderer Teile erstmal fertig zu bekommen) kann das Model beispielsweise einfach eine Implementierung von AddressBookRepository erhalten, die die Adressbücher in einer ArrayList verwaltet. Später tauscht man das durch DB-Implementierungen aus usw. Oder man bindet einen Cloud-Dienst an.

Natürlich ist das alles nur schemenhaft dargestellt.
 

ralfb1105

Bekanntes Mitglied
Hallo mihe7,
Du hast im Listener den Methodennamen offensichtlich von exceptionOccurred nach exceptionThrown geändert, in fireException dann aber exceptionOccurred aufgerufen :)
Es war noch viel schlimmer :D ich habe heute Morgen viel Zeit benötigt um zu verstehen was ich falsch gemacht habe. Du hast alles richtig beschrieben nur ich habe es nur zu 80% verstanden und somit völlig falsch implementiert - das gute daran - es war eine gute Übung zu diesem Thema und ich habe (hoffentlich) etwas "fürs Leben" gelernt :rolleyes:
Die Auflösung ist simpel - ich hatte kein Interface ExceptionListener erstellt, so dass mir Eclipse eins von java.bean importiert hat - was natürlich die Mthode nicht kennt. Ich habe das gar nicht wissentlich bermerkt. Ich habe nun folgendes codiert:
Interface ExceptionListener.java
Java:
package application;

public interface ExceptionListener {
    void exceptionOccurred(Throwable th);
}
Dann der Code in DB.java, quasi mein Model:
Java:
package application;

import java.sql.Connection;
import java.sql.DriverManager;
import oracle.jdbc.OracleDriver;


public class DB {

    // Fields
    private ExceptionListener exceptionListener;

    // Constructor

    public DB() {

    }

    // Methods

    public void registerExceptionListener(ExceptionListener l) {
        exceptionListener = l;
    }

    private void fireException(Throwable th) {
        if (exceptionListener != null) {
            exceptionListener.exceptionOccurred(th);
        }
    }

    /*
     * Create a database connection using jdbc and provided connection string and
     * user/password information. This method will throw all Exceptions to the
     * calling method in the Controller. The Exception will be shown and logged via
     * the Controller class.
     */

    public Connection dbConnect(String dbConnectString, String dbUserId, String dbPassword) {
        try {
            DriverManager.registerDriver(new OracleDriver());
            Connection conn = DriverManager.getConnection(dbConnectString, dbUserId, dbPassword);
            return conn;
        } catch (Exception ex) {
            fireException(ex);
            return null;
        }
    }

}

Die Registrierung im Controller Konstruktor:
Java:
db.registerExceptionListener(new ExceptionListener() {
            @Override
            public void exceptionOccurred(Throwable th) {
                String msg = String.valueOf(th);
                messageTextArea.appendText(msg + "\n");
                LOGGER.severe(msg);
            }
        });

Damit läuft es jetzt, und ich hoffe es ist jetzt so wie Du es vorgeschlagen hast.

Gruß

Ralf
 

ralfb1105

Bekanntes Mitglied
@Robat und @mihe7
Jetzt zu der Thematik

Ich habe nur die halbe Wahrheit geschrieben, um das Prinzip zu verdeutlichen. Du musst die Registrierung des Listeners nämlich irgendwo auch wieder aufheben, ansonsten wirst Du ggf. weiter über den Listener informiert, obwohl die View längst geschlossen ist.

Ich vermute bei mir ist das auch ohne Aufhebung erst einmal OK, da ich nur die eine Main View habe, mal abgeshen von dem Help About Dialog, und wenn die mainView beendet wird ist damit mein Programm beendet.

Dennoch würde ich gerne verstehen wie so eine De-Registrierung funktinieren würde, da ich ja ggf. später mal mehrere Views in einer Applikation behandeln muss.

Man könnte sich im Controller auch die Stage holen und einen EventHandler fürs Schließen implementieren..

Danke für Deinen Vorschlag, aber wie häufig habe ich Probleme bei der Implementierung :(
Hier meine Versuche der Implementierung:
Ich habe mir versucht die Stage zu holen mit folgendem Aufruf:
Java:
Stage stageMain = (Stage) exit.getScene().getWindow();

Leider funktioniert das bei mir nicht, bzw. ich weiß nicht wo im Controller ich das asuführen sollte. Ich habe es Im Konstruktor oder in der Initialize() Methode probiert, da in beiden Fällen kommt eine NPE o_O

Der "exit" FXML Node existiert in der Stage.

Frage1:
Könntest Du mir helfen zu verstehen wie ich den EventHandler implemntieren muss um beim schließen des View Aktionen, wie z.B. die De-Registrierung des ExpectionListener auszuführen?

Frage2:
Weiterhin ist mir auch nicht klar wie ich die De-Registrierung dieses ExpectionListener durchführe?

Ich hoffe ich habe mich verständlich ausgedrückt ...

Gruß

Ralf
 

mihe7

Top Contributor
Dennoch würde ich gerne verstehen wie so eine De-Registrierung funktinieren würde, da ich ja ggf. später mal mehrere Views in einer Applikation behandeln muss.
Es geht einfach darum, dass das Model keine Referenz mehr zu Deinem Listener haben soll. Im konkreten Fall setzt Du einfach in Deiner DB-Klasse den exceptionListener auf null :)

JavaFX: weiß ich nicht; da bin ich nicht zu Hause.
 

ralfb1105

Bekanntes Mitglied
Hallo mihe7,
ich würde das dann so in der DB Klasse implementieren:
Java:
public void deRegisterExceptionListener() {
        exceptionListener = null;
    }

Bezüglich JavaFX und dem EventHandler hoffe ich das Robat mir helfen kann.
Gruß
Ralf
 

Robat

Top Contributor
Die Stage ist in der initialize() Methode noch nicht verfügbar ... getStage() gibt hier null zurück.
Was du machen kannst ist die Stage aus der Main-Klasse zu injecten und den Listener im Setter hinzufügen. Ist aus dem Kopf, ohne zu testen, geschrieben. Also nicht wundern, wenn es syntaktisch nicht 100% korrekt ist.
Java:
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("MyFXML.fxml"));
        Controller controller = loader.getController();
        controller.setStage(primaryStage);

        ....
    }
}

public class Controller implements Initializable, ExceptionListener {
    ...
    
     @Override
     public void initialize() {
           model.registerExceptionListener(this);
     }

    public void setStage(Stage stage) {
        stage.setOnCloseRequest(event -> model.removeExceptionListener(this));
    }

     @Override
      public void exceptionOccurred(Throwable th) {
            String msg = String.valueOf(th);
            messageTextArea.appendText(msg + "\n");
             LOGGER.severe(msg);
       }
}
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,

ich befürchte das ist eine Nummer zu hoch für mich :confused:
Ich habe versucht das zu implementieren, scheitere aber kläglich ...
Es ist schwierig das hier wieder zu geben damit Du mir vielleicht einen Tipp geben kannst, ich versuche es aber trotzdem mal.
Hier mein Code in Main.java - wo mir beim starten schon eine NPE geschmissen wird:
Java:
public class Main extends Application {

    private static Logger LOGGER = Logger.getLogger(Main.class.getName());

    @Override
    public void start(Stage primaryStage) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
            Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
            Controller controller = loader.getController();
            controller.setStage(primaryStage);
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.setTitle("OraSimpleConnectFX");
            primaryStage.setResizable(false);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Ich bin mir schon nicht sicher beim FXMLLoader - vermute da ist schon ein Fehler ??? Die NPE kommt bei der Zeile
Java:
controller.setStage(primaryStage);
da vermutlich die "primaryStage" null ist !??

In der DB Klasse habe ich nichts geändert, außer die neue Methode removeExcpetionListener().
Java:
public void removeExceptionListener() {
        exceptionListener = null;
    }
Hier vermute ich mal keinen Fehler.
Dann zu meinem Controller und hier wird es für mich ganz :confused:

1. Wenn ich "Initializable" implementiere will er folgende Methode haben:
Java:
@Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
       
    }
Hiermit weiß ich ehrlich gesagt gar nichts anzufangen, ich habe ja bereits eine Methode "initialize()", wenn Du Dich erinnerst, die nutze ich um z.B. ein TextFeld mit einem Wert zu setzen der erst nach dem Start zur Verfügung steht.
Frage1:
Was muss ich in die "initialize(URL location, ResourceBundle resources)" schreiben bzw. kann ich die auch "leer" lassen?

Dann habe ich das mit dem ExpectionListener nun folgendermaßen implementiert - hier nur die relevanten Code Schnipsel - hoofe das reicht zum Verständnis und um zu wiisen ob das so korrekt ist.

1. Das Interface ExceptionListener implementiert:
Java:
public class Controller implements Initializable, ExceptionListener {
...
}

2.
Java:
private ExceptionListener exceptionListener;
Und dann in der Methode initialize() den Listener registriert:
Java:
public void initialize() {
        logFileLocation.setText(logFile);
        db.registerExceptionListener(exceptionListener);
    }

3. Die Methode exceptionOccured implementiert:
Java:
@Override
    public void exceptionOccurred(Throwable th) {
        String msg = String.valueOf(th);
        messageTextArea.appendText(msg + "\n");
        LOGGER.severe(msg);
    }

4. Die Methode setStage() implementiert:
Java:
public void setStage(Stage stage) {
        stage.setOnCloseRequest(event -> db.removeExceptionListener());
    }

Das müsste es gewesen sein - ich hoffe Du kannst Dir ein Bild davon machen :) und hast hoffentlich den entscheidenen Hinweis - auch wenn der heißt: Alles Schrott was Du gemacht hast o_O
Gruß
Ralf
 

Robat

Top Contributor
Ändere mal
Java:
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
in
Java:
Parent root = loader.load();

1. Frage: lass implements Initializable weg. Das kannst du in deine vorhandene initialize() Methode packen

Den Rest schau ich mir später an - habs jetzt nur überflogen. - oder @mihe7 ist schneller ;)
 

Robat

Top Contributor
Bei 2. passt noch etwas nicht. Wenn du das Interface ExceptionListener implementierst, dann brauchst du keine Variable dafür anlegen, sondern kannst der Registrier-Funktion this übergeben.
Die Variable exceptionListener ist bei dir sonst immer null -> NPE
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
mit folgendem Code in Main,java startet die Applikation ohne NPE:
Java:
@Override
    public void start(Stage primaryStage) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
            Parent root = loader.load();
            Controller controller = loader.<Controller>getController();
            controller.setStage(primaryStage);
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.setTitle("OraSimpleConnectFX");
            primaryStage.setResizable(false);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Ich würde sagen: FIXED - Danke.

Leider funktioniert dann mit meiner restlichen Listener Implementation die Ausgabe der Expections nicht mehr, sprich die SQL etc. Exceptions werden nicht mehr angezeigt/weitergegeben???

Ich habe dann mal etwas probiert, und wenn ich das "implements ExceptionListener" und die @Override Methode weg lasse und das wie vorher so im Konstruktor des Controller mache, funktioniert es:
Java:
/*
     * Constructor
     */

    public Controller() {
        super();
        serviceWorkerTask1.messageProperty()
                .addListener((obs, oldMsg, newMsg) -> messageTextArea.appendText(newMsg + "\n"));
        serviceWorkerTask2.messageProperty()
                .addListener((obs, oldMsg, newMsg) -> messageTextArea.appendText(newMsg + "\n"));
        serviceWorkerConnectDB.messageProperty()
                .addListener((obs, oldMsg, newMsg) -> messageTextArea.appendText(newMsg + "\n"));
        try {
            LogManager.getLogManager().readConfiguration(inputStream);
        } catch (final IOException ex) {
            Logger.getAnonymousLogger().severe("Could not load default logging.properties file");
            Logger.getAnonymousLogger().severe(ex.getMessage());
        }

        db.registerExceptionListener(new ExceptionListener() {
            @Override
            public void exceptionOccurred(Throwable th) {
                String msg = String.valueOf(th);
                messageTextArea.appendText(msg + "\n");
                LOGGER.severe(msg);
            }
        });

    }

//    @Override
//    public void exceptionOccurred(Throwable th) {
//        String msg = String.valueOf(th);
//        messageTextArea.appendText(msg + "\n");
//        LOGGER.severe(msg);
//    }

Den Listener hatte ich ja vorher in der initialize() registriert:
Java:
db.registerExceptionListener(exceptionListener);
.

Frage1:
Habt Ihr eine Idee was jetzt beim Listener schief läuft?

Frage2:

Ich habe die Applikation vorher beim drücken eines Exit Button oder über das Menu File/Close mit einem "System.exit(0)" beendet. Jetzt, da ich die primaryStage ja im Controller habe, dachte ich mir das es vielleicht besser ist die Stage zu schließen wenn ich den Exit Button drücke. Also habe ich folgendes implementiert:
Java:
public void exitButtonTapped(ActionEvent event) {
        LOGGER.info("****** Exit OraSimpleConnect FX application ******");
        mainStage.close();
        //System.exit(0);
    }

Das funktioniert auch, aber der mühevoll implementierte Window Event scheint nicht zu greifen, denn nur wenn ich das Fenster über den Fenster "x" Button schließe kommen die Ausgaben, beim Exit Button kommt das nicht :-(
Java:
public void setStage(Stage stage) {
        mainStage = stage;
        mainStage.setOnCloseRequest(event -> {
            LOGGER.info("Close Stage: " + stage.getTitle());
            System.out.println("Close Stage: " + stage.getTitle());
            db.removeExceptionListener();
        });
    }
Wie kann ich meine Applikation denn nun schließen das dieser Event auch greift und die Aktionen die ich definiert habe, wie z.B. removeExceptionListener auch in jedem Fall greifen?

Gruß
Ralf
 

ralfb1105

Bekanntes Mitglied
Ich weiß ich bin eine harte Nuß :rolleyes:
Würde es Euch helfen wenn ich Euch das ganze Projekt als Eclipse Archiv zur Referenz bereitstelle?

Vielleicht ist es dann einfacher

Gruß
Ralf
 

Robat

Top Contributor
Vielleicht vorher kurz zur Erklärung: Im Handler deines "Close"-Buttons feuerst du einfach selbstständig ein Close-Event (was dem Event entspricht, welches gefeuert wird, wenn du auf das X klickst)
Probier es mal so:
Java:
public class MainController {

    @FXML
     private TextArea textArea;

    private Stage stage;
    private Model model;

    @FXML
    public void initialize() {
        this.model = new Model();
        model.registerExceptionListener(th -> {
            System.out.println("Exception has been thrown...");
            textArea.appendText(String.valueOf(th));
        });
    }

    @FXML
    public void onCloseButtonPressed(ActionEvent event){
        stage.fireEvent(new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST));
    }

    @FXML
    public void onDoSomethingButtonPressed(ActionEvent event) {
        model.doSomething();
    }

    public void setStage(Stage stage) {
        this.stage = stage;
        stage.setOnCloseRequest(event -> {
            System.out.println("onClose requested...");
            model.deregisterExceptionListener();
        });
    }
}
Des Rest ist eigentlich gleich geblieben. Aber zu Vollständigkeit halber:
Java:
@FunctionalInterface
public interface ExceptionListener {
    void exceptionOccurred(Throwable th);
}
public class Model {
    private ExceptionListener exceptionListener;

    public void doSomething() {
        try {
            // hier würde dein DB Code stehen ... 
            throw new Exception("Ooops....");
        } catch(Exception e) {
            exceptionListener.exceptionOccurred(e);
        }
    }

    public void registerExceptionListener(ExceptionListener exceptionListener) {
        System.out.println("Registered ExceptionListener...");
        this.exceptionListener = exceptionListener;
    }

    public void deregisterExceptionListener() {
        System.out.println("Deregistered ExceptionListener...");
        this.exceptionListener = null;
    }
}

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
        Pane root = loader.load();

        MainController controller = loader.getController();
        controller.setStage(primaryStage);

        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
jetzt habe ich alle Deine Vorschläge implementiert und es funktioniert wie gewünscht :D

Ich habe das Interface ExceptionListener in einer eigenen Datei implementiert, was aber so wie ich es verstanden habe OK ist - richtig?

Das war eine ganz schön schwere Geburt - das hätte ich in 100Jahren nicht hin bekommen.
Ich bin sehr froh das es so läuft und ich es auch einigermaßen verstanden habe, zumindest theoretisch ;)

Ich Danke euch beiden für die unermütliche Unterstützung - bis zum nächsten Mal ...
Gruß
Ralf
 

Robat

Top Contributor
Ja das ist vollkommen in Ordnung. Hab es nur oben zusammen in ein Code-Abschnitt geschrieben, weil ich zu faul war, es separat einzufügen :p
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
ich habe noch eine weitere Frage, wenn ich dafür einen eigenen Thread erstellen soll bitte sagen!

Ich habe das Problem das in meinem neu aufgerufenen Fenster (Help / About) die application.css nicht angezogen wird, und somit z.B. der Background fehlt oder die Schriftarten falsch sind. Das merkwürdige ist, und daher habe ich das bis jetzt gar nicht bemerkt, es ist nur zu sehen wenn ich das unter Windows/Mac OS als JAR ausführe - in Eclipse ist alles schön. Ich habe im Log dann folgende Fehlermeldung gefunden:
Code:
INFO: ****** Start OraSimpleConnect FX application ******
[Thu Jan 17 17:18:35 CET 2019 com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged]
INFO: Could not load stylesheet: rsrc:application.css

Die Datei "application.css" liegt unterhalb des "application" package, da wor auch die Source Files liegen.
Hier die Referenz der FXML Datei: Main.java
Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
...
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());

Aufruf aus Controller.java wenn Help/About Button gedrückt wird:
Java:
public void menuHelpAbout() throws IOException {
        FXMLLoader loaderAboutDialog = new FXMLLoader(getClass().getResource("aboutDialog.fxml"));
        Parent rootAboutDialog = loaderAboutDialog.load();
        Stage stageAboutDialog = new Stage();
        stageAboutDialog.initModality(Modality.NONE);
        stageAboutDialog.setOpacity(1);
        stageAboutDialog.setTitle("OraSimpleConnectFX About");
        stageAboutDialog.setScene(new Scene(rootAboutDialog));
        stageAboutDialog.show();
    }

Frage:
Muss ich denn auch noch so etwas wie
Java:
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
einbauen. Wenn ja, warum funktioniert das denn unter Eclipse ohne Probleme?

Gruß
Ralf
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,
auch wenn ich nicht verstehe warum es ohne bei Eclipse funktioniert, habe ich es im Controller auch eingebaut und es scheint nun auch als JAR Datei unter Windows zu gehen:
Java:
public void menuHelpAbout() throws IOException {
        FXMLLoader loaderAboutDialog = new FXMLLoader(getClass().getResource("aboutDialog.fxml"));
        Parent rootAboutDialog = loaderAboutDialog.load();
        Stage stageAboutDialog = new Stage();
        stageAboutDialog.initModality(Modality.NONE);
        stageAboutDialog.setOpacity(1);
        stageAboutDialog.setTitle("OraSimpleConnectFX About");
        Scene sceneAboutDialog = new Scene(rootAboutDialog);
        sceneAboutDialog.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        stageAboutDialog.setScene(sceneAboutDialog);
        stageAboutDialog.show();
    }

Die Meldung im Log kommt allerdings weiterhin .. .scheint damit also nichts zu tun zu haben ...

Gruß
Ralf
 

Robat

Top Contributor
Spontan kann ich dir auch nicht sagen woran das liegen könnte.
Du kannst ja spaßeshalber mal in der JAR Datei schauen, ob die CSS Datei vorhanden ist
 

ralfb1105

Bekanntes Mitglied
Da die Main View alles richtig anzeigt und ich nur eine application.css habe gehe ich mal davon aus das die Datei im jar File vorhanden ist - da ich im Moment nicht Online bin (nur Handy) kann ich es nicht überprüfen.
Es funktioniert wenn ich wie oben beschrieben im Scene „sceneAboutDialog“ auch das Stylesheet hinzufüge - so,wie es in Main gemacht habe.

Kannst Du mir sagen ob das generell so sein soll? Wenn ja, dann ist es für mich klar, das es ohne auch in Eclipse geht, na ja, warum auch immer ... kann ich dann aber mit leben.

Etwas nervös macht mich dann noch die Fehlermeldung, die aber für mich offensichtlich keine Einschränkung in der Funktion mit sich bringt ...

Gruß
Ralf
 

Robat

Top Contributor
Dadurch, dass du eine komplett neue Scene erstellst, sollte es normal sein dass du die CSS Datei auch zu deinem neuen Fenster / Scene hinzufügen musst. Du setzt es ja vorher nur zu der einen Scene.
Die Fehlermeldung verwirrt mich ehrlich gesagt auch ein wenig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
Z JavaFX Exception in Application start method AWT, Swing, JavaFX & SWT 2
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
R AWT no such child Exception AWT, Swing, JavaFX & SWT 7
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
VfL_Freak AWT Exception in der Eventqueue AWT, Swing, JavaFX & SWT 8
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
M 3D-Grafik Mac Java 3D in Eclipse Exception AWT, Swing, JavaFX & SWT 0
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
I Opencv Imgproc.floodfill exception AWT, Swing, JavaFX & SWT 1
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
T Gui Exception AWT, Swing, JavaFX & SWT 2
X Auf Fensterklasse zugreifen (Nullpointer Exception) AWT, Swing, JavaFX & SWT 2
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
V Swing Nullpointer Exception bei JFormattedTextField AWT, Swing, JavaFX & SWT 4
N Swing Exception: Comparison method violates its general contract! AWT, Swing, JavaFX & SWT 13
S Exception bei BufferStrategy AWT, Swing, JavaFX & SWT 8
H Swing Exception's und MVC AWT, Swing, JavaFX & SWT 35
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
K AWT DataBuffer in DataBufferInt Exception AWT, Swing, JavaFX & SWT 2
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
O Immer Exception in AWT-EventQueue-0 AWT, Swing, JavaFX & SWT 5
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
F Swing Seltsame Exception AWT, Swing, JavaFX & SWT 5
R Swing Files auflisten (JButton, JList, Exception) AWT, Swing, JavaFX & SWT 4
V LookAndFeel Nullpoint Exception AWT, Swing, JavaFX & SWT 2
Airwolf89 Swing Exception beim Füllen einer Tabelle AWT, Swing, JavaFX & SWT 10
hdi SWT Zwei mal Shell öffnen = Exception AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
B JTable ValueChanged verursacht Exception AWT, Swing, JavaFX & SWT 3
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
M Exception in eine JTextArea anzeigen AWT, Swing, JavaFX & SWT 7
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
G Kann mir jemand diese Exception erklaeren? AWT, Swing, JavaFX & SWT 8
T AWT Exception AWT, Swing, JavaFX & SWT 5
A Exception beim LineWrapping AWT, Swing, JavaFX & SWT 16
P Für mich unverständliche Exception AWT, Swing, JavaFX & SWT 3
N JList - Nullpointer Exception AWT, Swing, JavaFX & SWT 4
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
T Warum schmeißt das eine Exception? AWT, Swing, JavaFX & SWT 6
I EventDispatchThread Exception AWT, Swing, JavaFX & SWT 5
M Problem: "ArrayIndexOutOfBounds Exception" AWT, Swing, JavaFX & SWT 11
C Out of Bounds Exception, Array of JTextField AWT, Swing, JavaFX & SWT 6
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
D Seltsame AWT-Exception AWT, Swing, JavaFX & SWT 2
M Button und Exception mit NetBeans AWT, Swing, JavaFX & SWT 3
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
M Exception Meldung aus Thread an jTextField1 übergeben AWT, Swing, JavaFX & SWT 6
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
G Drag & Drop bzw. Data Transfer - Exception nach Drag AWT, Swing, JavaFX & SWT 1
K Exception mit "Unknown Source" AWT, Swing, JavaFX & SWT 5
Z jar-File mit SWT - Exception AWT, Swing, JavaFX & SWT 4
F Habe Problem mit dem Abfangen einer Exception AWT, Swing, JavaFX & SWT 10
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
T Programm funkt. nicht - Exception AWT, Swing, JavaFX & SWT 7
A Exception in thread "AWT-EventQueue-0" java.lang.N AWT, Swing, JavaFX & SWT 4
G Exception in JList oder JTextArea AWT, Swing, JavaFX & SWT 9
M java headless exception AWT, Swing, JavaFX & SWT 5
O Exception abfangen AWT, Swing, JavaFX & SWT 19
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
K JavaFX Message in TableView AWT, Swing, JavaFX & SWT 2
A Swing Zahlenraten GUI wirft nur die Error Message aus AWT, Swing, JavaFX & SWT 6
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
K SWT TitleAreaDialog - SelectionListener zur Message hinzufügen AWT, Swing, JavaFX & SWT 3
B Message Encoder Decoder AWT, Swing, JavaFX & SWT 27
G Swing Meldung mit joptionpane information message AWT, Swing, JavaFX & SWT 22
M swt - input message box AWT, Swing, JavaFX & SWT 4
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
S UI Model Binding AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben