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
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
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
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
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