JavaFX JavaFXThread, launch, start

LeNkUeP

Mitglied
Hallo,

habe ein Problem welches schon sehr häufig bei anderen Usern aufgekommen ist, nur in meinem Fall konnte ich bisher keine einzige Lösung finden:(

Kurze Beschreibung: Hab ein Hauptprogramm (Swing), und dieses ruft ein anderes Programm (JavaFX) auf...soll nachher in einem jar liegen aber im Moment wird einfach die main aufgerufen.
Dieses FX Programm ist eine Application. Mein Problem ist eigentlich ganz "simpel":
An einer bestimmten Stelle im Hauptprogramm wird eben diese Standalone-App gestartet...dann wenn man sie schließt (das Hauptprogramm aber nicht), dann sollte man wenn man erneut an die Stelle kommt die App erneut starten können...das ist aber definitiv nicht so einfach wie man denkt :D
Launch darf nur einmal aufgerufen werden, beim zweiten Start der App bin ich nicht im FXThread und viele Fehler mehr sind mir schon begegnet.

Versucht habe ich schon folgendes:
1. Launch einmal aufrufen, danach dann immer start alleine aufrufen
2. JFXPanel einfach initialisieren
3. Platfrom.runlater (teilweise fehlerlos gelaufen, jedoch wurde Runnable nie ausgeführt???xD)
4. Komplette Loslösung von Application

Aber mit all diesen Dingen hat es trotzdem nicht geklappt...
Ich will eigentlich nur eine App kompakt und komplett losgelöst so oft öffnen können wie ich möchte...Kann vielleicht man irgendwie den gesamten FXThread schließen sodass man Launch erneut aufrufen kann? Oder wie muss ich runLater benutzen damit das funktioniert und und und...
Hier noch mein Code :)
Code:
package com.veda.appl.system.tools.feed;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Text;
import org.jdom.filter.Filter;
import org.xml.sax.SAXException;

import com.sun.javafx.application.ParametersImpl;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;

public class standaloneApp extends Application{

    private TableView<Server> table = new TableView<Server>();
    private ObservableList<Server> data = FXCollections.observableArrayList();
    final HBox buttonBox = new HBox();
    final HBox browserBox = new HBox();

    private String file = "https://www.test.de";
    private String show = "OK";
    private String descriptionText;
    private WebView browser;
    Button proceedButton;
    private boolean error = false;

    private boolean browserView = false;
   
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, JDOMException {
        JFXPanel panel = new JFXPanel();
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new Elster_ServerAvailability().start(new Stage());
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        });
    }


    private static Filter itemFilter = new Filter() {
        @Override
        public boolean matches(Object obj) {
            if (obj instanceof Element) {
                if (((Element) obj).getName().equals("item")) {
                    return true;
                }
            }
            return false;
        }
    };

    @SuppressWarnings("unchecked")
    @Override
    public void start(final Stage stage) throws ParserConfigurationException, SAXException, IOException, JDOMException {
        Parameters parameters = ParametersImpl.getParameters(this);
        if(parameters != null){
            List<String> params = parameters.getRaw();
            for (int i = 0; i < params.size(); i++) {
                String current = params.get(i).trim().toUpperCase();
                if (current.startsWith("STATUS_")) {
                    String tmp = current.substring(current.indexOf("_") + 1, current.length());
                    this.show = tmp;
                } else {
                    if (current.startsWith("SOURCE_")) {
                        String tmp = params.get(i).trim().substring(current.indexOf("_") + 1, params.get(i).length());
                        this.file = tmp;
                    }
                }
            }
        }

        TableColumn serverCol = new TableColumn("Server");
        TableColumn statusCol = new TableColumn("Verfügbarkeit");

        serverCol.setMinWidth(500);
        serverCol.setCellValueFactory(new PropertyValueFactory<Object, Object>("server"));
        statusCol.setMinWidth(285);
        statusCol.setCellValueFactory(new PropertyValueFactory<Object, Object>("status"));

        fillTable(this.file, stage);

        proceedButton = new Button("Ok");
        proceedButton.setMinWidth(100);
        proceedButton.setMinHeight(40);
        proceedButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                if (!browserView) {
                    stage.close();
                } else {
                    proceedButton.setDisable(true);
                    browserView = false;
                    ResizeHeightTranslation labelAnim = new ResizeHeightTranslation(Duration.millis(300), browserBox, 0);
                    labelAnim.play();
                    proceedButton.setText("OK");
                    labelAnim.setOnFinished(new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent event) {
                            ResizeHeightTranslation labelAnim = new ResizeHeightTranslation(Duration.millis(300), browserBox, 100);
                            labelAnim.play();
                            ResizeHeightTranslation tableAnim = new ResizeHeightTranslation(Duration.millis(300), table, 400);
                            tableAnim.play();
                            table.setVisible(true);
                            createBrowser(descriptionText);
                            tableAnim.setOnFinished(new EventHandler<ActionEvent>() {
                                @Override
                                public void handle(ActionEvent event) {
                                    proceedButton.setDisable(false);
                                }
                            });
                        }
                    });
                }
            }
        });
        proceedButton.autosize();

        table.setItems(data);
        table.getColumns().addAll(serverCol, statusCol);
        table.setMaxWidth(800);
        table.setPlaceholder(new Label("Kein Server entspricht den Filterkriterien!"));
       
        statusCol.setCellFactory(new Callback() {
            @Override
            public Object call(Object column) {
                return new TableCell<Server, String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);

                        if (item == null || empty) {
                            setText(null);
                            setStyle("");
                        } else {
                            // Format date.
                            setText(item.toString());
                            // Style all dates in March with a different color.
                            if (item.toUpperCase().equals("HINWEIS")) {
                                setStyle("-fx-font-weight: bold; -fx-text-fill: orange");
                            } else if (item.toUpperCase().equals("OK")) {
                                setStyle("-fx-font-weight: bold; -fx-text-fill: green");
                            } else if (item.toUpperCase().equals("FEHLER")) {
                                setStyle("-fx-font-weight: bold; -fx-text-fill: red");
                            }
                        }
                    }
                };
            }
        });

        table.setOnMousePressed(new EventHandler<MouseEvent>() {
            public void handle(final MouseEvent mouseEvent) {
                table.getColumns().get(1).setCellFactory(new Callback() {
                    @Override
                    public Object call(Object column) {
                        return new TableCell<Server, String>() {

                            @Override
                            protected void updateItem(String item, boolean empty) {
                                // TODO Auto-generated method stub
                                super.updateItem(item, empty);

                                if (item == null || empty) {
                                    setText(null);
                                    setStyle("");
                                } else {
                                    Server currentSurver = getTableView().getItems().get(getIndex());
                                    setText(item);
                                    // Style all dates in March with a different
                                    // color.
                                    if (getTableView().getSelectionModel().getSelectedItems().contains(currentSurver)) {
                                        setStyle("-fx-font-weight: bold; -fx-text-fill: white");
                                    } else if (item.toUpperCase().equals("HINWEIS")) {
                                        setStyle("-fx-font-weight: bold; -fx-text-fill: orange");
                                    } else if (item.toUpperCase().equals("OK")) {
                                        setStyle("-fx-font-weight: bold; -fx-text-fill: green");
                                    } else if (item.toUpperCase().equals("FEHLER")) {
                                        setStyle("-fx-font-weight: bold; -fx-text-fill: red");
                                    }
                                }
                            }
                        };
                    }
                });
            }
        });

        buttonBox.getChildren().addAll(proceedButton);
        buttonBox.setAlignment(Pos.CENTER);

        if (this.browser != null) {
            this.browser.setFontScale(0.8);
            browserBox.setMaxHeight(100);
            browserBox.setMaxWidth(800);
            browserBox.getChildren().addAll(this.browser);
            browserBox.setAlignment(Pos.CENTER);
        }

        VBox vbox = new VBox();
        vbox.setSpacing(10);
        vbox.setAlignment(Pos.CENTER);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(browserBox, table, buttonBox);

        StackPane root = new StackPane();
        root.getChildren().add(vbox);
        stage.setScene(new Scene(root, 850, 600));
        stage.setTitle("Test");
        stage.setResizable(false);
        if (!error) {
            stage.show();
        }
    }

    public void fillTable(String urlAddress, Stage stage)
            throws ParserConfigurationException, SAXException, IOException, JDOMException {
        Document xml = new Document();
        try {
            xml = RSSFeedConverter.rssToXMLDocument(urlAddress);
        } catch (Exception e) {
            error = true;
            ExceptionWindow newWindow = new ExceptionWindow();
            newWindow.openWindow(stage, e);
            return;
        }
        Element x = xml.getRootElement();
        Iterator<?> iterator = x.getDescendants(itemFilter);

        while (iterator.hasNext()) {
            try {
                Element currentItem = (Element) iterator.next();
                Element title = (Element) currentItem.getChild("title");
                String titleText = ((Text) title.getContent(0)).getValue();
                Element description = (Element) currentItem.getChild("description");
                String descriptionText = ((Text) description.getContent(0)).getValue();

                if (!titleText.equals("Beschreibung")) {
                    if (isCurrentServerRelevant(titleText, descriptionText)) {
                        data.add(new Server(titleText, descriptionText));
                    }
                } else {
                    this.descriptionText = descriptionText;
                    this.browser = new WebView();
                    createBrowser(this.descriptionText);
                }
            } catch (Exception e) {
                // go on
            }
        }
    }

    private boolean isCurrentServerRelevant(String titleText, String descriptionText) {
        if (descriptionText.equals("OK") && this.show.equals("OK")) {
            return true;
        } else {
            if (descriptionText.equals("Hinweis") && (this.show.equals("OK") || this.show.equals("HINWEIS"))) {
                return true;
            } else {
                if (descriptionText.equals("Fehler")
                        && (this.show.equals("OK") || this.show.equals("HINWEIS") || this.show.equals("FEHLER"))) {
                    return true;
                }
            }
        }
        return false;
    }

    private void createBrowser(String descriptionText) {
        this.browser.getEngine().loadContent("<html style=background-color:#dbdbdb> <div style=background-color:#dbdbdb> <font face=Verdana size=3> <p><u>Meldung:</u></p>"
                        + descriptionText
                        + "Für weitere Informationen klicken Sie bitte <a href=https://www.elster.de/elsterweb/svs><font size=4>hier</font></a> </font> </div> </html>");
        this.browser.getEngine().setOnStatusChanged(new EventHandler<WebEvent<String>>() {
            @Override
            public void handle(WebEvent<String> webEvent) {
                if ((browser.getEngine().getTitle() == null || browser.getEngine().getTitle().equals("ELSTER")) && !browserView) {
                    browser.setOnMouseClicked(new EventHandler<MouseEvent>() {
                        @Override
                        public void handle(MouseEvent mouseEvent) {
                            if(browser.getEngine().getLoadWorker().isRunning()){
                                proceedButton.setDisable(true);
                                animateOpenBrowser();
                            }
                        }

                        private void animateOpenBrowser() {
                            ResizeHeightTranslation tableAnim = new ResizeHeightTranslation(Duration.millis(300), table, 0);
                            tableAnim.play();
                            ResizeHeightTranslation labelAnim = new ResizeHeightTranslation(Duration.millis(300), browserBox, 0);
                            labelAnim.play();
                            browserBox.setMaxHeight(0);
                            table.setMaxHeight(0);
                            proceedButton.setText("Zurück");
                            browserView = true;
                            tableAnim.setOnFinished(new EventHandler<ActionEvent>() {
                                @Override
                                public void handle(ActionEvent event) {
                                    table.setVisible(false);
                                    ResizeHeightTranslation labelAnim = new ResizeHeightTranslation(Duration.millis(300), browserBox, 500);
                                    labelAnim.play();
                                    labelAnim.setOnFinished(new EventHandler<ActionEvent>() {
                                        @Override
                                        public void handle(ActionEvent event) {
                                            proceedButton.setDisable(false);
                                        }
                                    });
                                }
                            });
                        }
                    });
                } else {
                    browser.setOnMouseClicked(null);
                }
            }
        });
    }

    public int getCellIndex(int cellPosition) {
        String number = "" + cellPosition;
        int result = 0;
        for (int i = 0; i < number.length(); i++) {
            result += Integer.parseInt(number.substring(i, i + 1));
        }
        return result;
    }
}

Der Code wie er hier steht könnte in der main ggf. ganz falsch sein...wollte nur meine grobe Codestruktur mal erklären und bereitstellen.

Über konkrete Lösungsansätze würde ich mich sehr freuen:)
Danke im Voraus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JavaFX Prozess bei dem Start pausieren AWT, Swing, JavaFX & SWT 5
D Start JUNG application with an Empty plot or visualisation AWT, Swing, JavaFX & SWT 1
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
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
R NullPointerException beim Start des Fensters AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
J Splashscreen Start Anwendung AWT, Swing, JavaFX & SWT 14
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
M Start-/ Stop-Button Problem AWT, Swing, JavaFX & SWT 2
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
javampir 3D-Grafik JPCT Start AWT, Swing, JavaFX & SWT 2
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
M Beim Start von TableEditor Inhalt der Zelle markieren. AWT, Swing, JavaFX & SWT 2
T Divider zentrieren bei Gui Start AWT, Swing, JavaFX & SWT 21
V Start Button und Wert Eingabe in ein Fenster AWT, Swing, JavaFX & SWT 2
B JFrame nach Start leer, größer ziehen zeigt Inhalt an AWT, Swing, JavaFX & SWT 2
A Kompilierfehler: illegal start of expression AWT, Swing, JavaFX & SWT 2
R Eingabeaufforderungs-Fenster beim start schliessen - wie? AWT, Swing, JavaFX & SWT 6
V Daten ins JTable laden bei Start der GUI AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben