JavaFX - problem z wystartowaniem pliku jar

Odpowiedz Nowy wątek
2018-01-17 11:57

Rejestracja: 5 lat temu

Ostatnio: 6 miesięcy temu

0

Cześć.
Podczas testów aplikacji mam niespotykany błąd. Google przeszukane niestety bez rezultatów.

Aplikacja startuje w trayu i wyświetla komunikaty o pewnych zdarzeniach. Gdy uruchomię aplikację dwuklikiem to niestety komunikaty się nie pojawiają (aplikacja działa, ale bez komunikatów). Gdy odpalę ja z consoli z java -jav app.jar wszystko działa bez problemów. Postanowiłem problem obejść i odpalić apkę z bata, ale niestety tutaj jest sytuacja taka, że konsola zostaje otwarta po uruchomieniu z komendy start java -jar app.jar.

Poszukuję rozwiązania, albo z plikiem bat tak by konsola się zamykała, ale nie zamykała aplikacji lub modyfikacja kodu javy. Ewentualnie czy istnieje możliwość odpalenia pliku jar z komendą java -jar ? Dopisanie tego w manifescie czy gdzieś ?

Winne są pewnie komunikaty i odpalenie apki w trayu.

Klasa komunikatów:

public class NotificationControl {

    private static Notifications notificatorBulider;

    public Notifications getNotificatorBulider() {
        return notificatorBulider;
    }

    public void createNotification(String title, String text) {
        Stage dummyPopup = new Stage();
        dummyPopup.initModality(Modality.NONE);
        dummyPopup.initStyle(StageStyle.UTILITY);
        dummyPopup.setOpacity(0d);
        final Screen screen = Screen.getPrimary();
        final Rectangle2D bounds = screen.getVisualBounds();
        dummyPopup.setX(bounds.getMaxX());
        dummyPopup.setY(bounds.getMaxY());
        final Group root = new Group();
        dummyPopup.setScene(new Scene(root, 1d, 1d, Color.TRANSPARENT));
        dummyPopup.show();

        notificatorBulider = Notifications.create()
        .title(title)
        .text(text)
        .hideAfter(Duration.hours(24))
        .position(Pos.BOTTOM_RIGHT)
        .onAction(event ->{
            notificatorBulider = null;
            if (Main.getStage() != null) {
                Main.getStage().show();;
                Main.getStage().toFront();
            }   
        });
        notificatorBulider.showInformation();   
    }
}

wycinek klasy wyswietlajacej komuniakt:

    //Listener nasłuchuje czy jest nowa wiadomość i wyświetla komunikat 
        NotificationControl n = new NotificationControl();
            MessageControls.isNewMessage().addListener((arg, oldVal, newVal) ->{

                Platform.runLater(() -> {
                    String title = "Nowa Wiadomość!";
                    String message = "Masz nową wiadomość! Otwórz program " + Main.appName;
                    if(!(n.getNotificatorBulider() != null))
                    n.createNotification(title, message);

                });
            });
        }

i klasa main

public class Main extends Application{

    protected static Stage stage;
    public static Stage getStage() { return stage;}
    public static void setStage(Stage stage) {Main.stage = stage;}

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

    @Override
    public void start(Stage primaryStage) throws Exception {

        Platform.setImplicitExit(false);
        javax.swing.SwingUtilities.invokeLater(() -> {

            try { addAppToTray();
            } catch (AWTException | IOException e ) {e.printStackTrace();}
        });

        Main.stage = primaryStage;

        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/main/Main.fxml"));
        Pane pane = loader.load();
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);

        SceenControl.setDefaultScreent();

        primaryStage.getIcons().add(new javafx.scene.image.Image((this.getClass().getResourceAsStream("appIcon.jpg"))));
        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                primaryStage.hide();
            }
        });
    }

    private static java.awt.SystemTray tray;

    private void addAppToTray() throws AWTException, IOException {

            java.awt.Toolkit.getDefaultToolkit();

            if (!java.awt.SystemTray.isSupported()) {
                System.out.println("No system tray support, application exiting.");
                Platform.exit();
            }

            tray = java.awt.SystemTray.getSystemTray();

            ImageIcon imageIcon = new ImageIcon(getClass().getResource("/icons/appIconTray.jpg"));

            Image image = imageIcon.getImage();

            java.awt.TrayIcon trayIcon = new java.awt.TrayIcon(image);

            trayIcon.addActionListener(event -> Platform.runLater(this::showStage));
            java.awt.MenuItem openItem = new java.awt.MenuItem(appName + "  (Otwórz)");
            openItem.addActionListener(event -> Platform.runLater(this::showStage));
            java.awt.Font defaultFont = java.awt.Font.decode(null);
            java.awt.Font boldFont = defaultFont.deriveFont(java.awt.Font.BOLD);
            openItem.setFont(boldFont);
            java.awt.MenuItem exitItem = new java.awt.MenuItem("Exit");
            exitItem.addActionListener(event -> {
                MessageNewTask ms = new MessageNewTask();
                ms.cancel();
                Platform.exit();
                tray.remove(trayIcon);
            });

            final java.awt.PopupMenu popup = new java.awt.PopupMenu();
            popup.add(openItem);
            popup.addSeparator();
            popup.add(exitItem);
            trayIcon.setPopupMenu(popup);

            tray.add(trayIcon);

        }
    private void showStage() {
        if (stage != null) {
            stage.show();
            stage.toFront();
        }
    }
edytowany 3x, ostatnio: szymon708, 2018-01-17 12:09

Pozostało 580 znaków

2018-01-17 12:10

Rejestracja: 14 lat temu

Ostatnio: 3 minuty temu

0

Jak już się bawisz w takie rzeczy to w plikach BAT można użyć komendy START: https://stackoverflow.com/q/17201507


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2018-01-17 12:28

Rejestracja: 5 lat temu

Ostatnio: 6 miesięcy temu

0
Wibowit napisał(a):

Jak już się bawisz w takie rzeczy to w plikach BAT można użyć komendy START: https://stackoverflow.com/q/17201507

użyłem i zostawia konsole otwartą. Użyłem też komend /b/d/k wszytsko co było w googlach i również nic. Odpalenie bez komend -java -jar działa bez problemu. Przed chwilą skonwertowałem do exeka i również działa bez problemu. Ostatecznie zostawię na execu, ale dręczy mnie dlaczego nie działa na zwykłym jarze.

Pozostało 580 znaków

2018-01-17 12:34

Rejestracja: 14 lat temu

Ostatnio: 3 minuty temu

0

A pokaż ten plik BAT


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2018-01-17 12:44

Rejestracja: 5 lat temu

Ostatnio: 6 miesięcy temu

0

Wielkiej filozofii tam nie ma :) Jedna linijka:

start java -jar app.jar

edytowany 1x, ostatnio: szymon708, 2018-01-17 12:44

Pozostało 580 znaków

2018-01-17 22:42

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

Lokalizacja: Siemianowice Śląskie

0

Ten warunek jest nieczytelny. Nie wolno tak pisać. A może on też jest błędny i dlatego nie działa?

if(!(n.getNotificatorBulider() != null))
n.createNotification(title, message);

edit: Nieczytelny bo podwójne zaprzeczenie i brak wcięcia.


Przeważnie ignoruję niezarejestrowanych użytkowników.
edytowany 2x, ostatnio: jarekczek, 2018-01-17 22:44

Pozostało 580 znaków

2018-01-18 08:26

Rejestracja: 5 lat temu

Ostatnio: 6 miesięcy temu

0

A może nie. Jak może być błędny jak działa odpalony z konsoli a nie działa odpalony na 2x klik ? Nie uważasz, że gdyby warunek był błędny to nie działał by w każdym przypadku ? W eclipsie działa bez problemu itp itd Ale zgodzę się, gdyż był tam dłuższy warunek i nawiasy zostały - moje niedopatrzenie bije się w pierś. Nie to nie jest wina warunku tu jest coś nie tak z tym, że program jest w trayu i musiałem dopisać pseudo okno Stage dummyPopup = new Stage(); żeby pojawiał się komunikat bo inaczej klasa komunikatów NIE WIDZI okna w trayu. Dla niej takie okno nie istnieje. Gdy wywołam okno z traya komunikaty pojawiają się bez problemu w każdym przypadku.

edytowany 1x, ostatnio: szymon708, 2018-01-18 08:26

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0