Jar prodotto non funzionante

di il
4 risposte

Jar prodotto non funzionante

Ho iniziato a esercitarmi con JavaFX creando una semplice calcolatrice, come IDE utilizzo IntelliJ idea e eseguendo il programmino tramite run tutto funziona correttamente, il problema si crea quando eseguo la build, infatti l'eseguibile che ottengo nella cartella out non da nessun cenno di vita quando premuto. Non ho trovato nessuna soluzione in giro su internet e nonostante io esegua tutti i passaggi nulla sembra funzionare; lascio allegato il codice e gli screenshot.
package com.example.minicalculator;

/* -----------------------------------------------------------------------
                        MiniCalculator

    Programmer: Davide Giacomelli

    Program creation: 28/11/2021

    Last edit: 28/11/2021

    Version: 1.0.0
 -----------------------------------------------------------------------*/


import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.layout.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.stage.*;


import java.text.DecimalFormat;

import static javafx.scene.paint.Color.WHITE;


public class MiniCalculator extends Application implements EventHandler<ActionEvent> {


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




    //GUI controls
    private Button[] keyBoard;
    private TextField screen;

    //GUI layout
    private VBox kPanel;
    private HBox kLine1, kLine2, kLine3, kLine4;
    private Scene scene;
    Stage stage;

    //calculator variables
    private double result;
    String[] splitCheck0;

    /*
    change this value to change the precision
    cambia questo valore per modificare la precisione
    */
    private String precision = "0.######";





    // metodo main
    @Override
    public void start(Stage s) {

        Image icon = new Image("file:src/icons/ico.png");


        screen = new TextField();
        screen.setMinHeight(50);
        screen.setEditable(false);

        Button[] keyBoard = new Button[]{
                new Button("7"), new Button("8"), new Button("9"), new Button("×"),
                new Button("4"), new Button("5"), new Button("6"), new Button("+"),
                new Button("1"), new Button("2"), new Button("3"), new Button("÷"),
                new Button("C"), new Button("0"), new Button("="), new Button("-"),
        };


        for (int i = 0; i < keyBoard.length; i++) {
            keyBoard[i].setMinHeight(45);
            keyBoard[i].setMinWidth(45);
            keyBoard[i].setMaxHeight(45);
            keyBoard[i].setMaxWidth(45);
            keyBoard[i].setOnAction(this);
        }


        kPanel = new VBox();

        kLine1 = new HBox();
        kLine1.getChildren().addAll(keyBoard[0], keyBoard[1], keyBoard[2], keyBoard[3]);
        kLine2 = new HBox();
        kLine2.getChildren().addAll(keyBoard[4], keyBoard[5], keyBoard[6], keyBoard[7]);
        kLine3 = new HBox();
        kLine3.getChildren().addAll(keyBoard[8], keyBoard[9], keyBoard[10], keyBoard[11]);
        kLine4 = new HBox();
        kLine4.getChildren().addAll(keyBoard[12], keyBoard[13], keyBoard[14], keyBoard[15]);


        kPanel.getChildren().addAll(screen, kLine1, kLine2, kLine3, kLine4);


        scene = new Scene(kPanel, 181.9, 232, WHITE);


        stage = new Stage();

        stage.setResizable(false);
        stage.getIcons().add(icon);
        stage.setScene(scene);
        stage.show();
    }






//il seguente metodo inserisce il valore digitato tramite tastiera

    private Button btn;
    private String btnText;
    private String screenText;

    @Override
    public void handle(ActionEvent e) {

        btn = (Button) e.getSource();
        btnText = btn.getText();
        screenText = screen.getText();


        //Verifica del valore + operazione collegata al dato inserito


        //Reset
        if (btnText == "C") {
            screen.setText("");
            //operatori
        } else if (btnText == "+") {
            runCalcs("+");
        }
        else if (btnText == "-") {
            runCalcs("-");
        }
        else if (btnText == "×") {
            runCalcs("×");
        }
        else if (btnText == "÷") {
            runCalcs("÷");
        }
        //uguale
        else if (btnText == "=")
        {
            runCalcs("=");
        }
        //valore numerico
        else if (Integer.parseInt(btnText) > 0 & Integer.parseInt(btnText) <= 9)
        {
            screen.setText(screenText + btnText);
            // eccezione 0 (se l'utente tenta di posizonare 0 all'inizio della stringa non viene posizionato)
        } else if (Integer.parseInt(btnText) == 0)
        {
            if (screen.getText() == "") {

            }
            else if (screen.getText().contains("+"))
                set0("+");
            else if (screen.getText().contains("-"))
                set0("-");
            else if (screen.getText().contains("×"))
                set0("×");
            else if (screen.getText().contains("÷"))
                set0("÷");

        }
        //errore
        else
            System.exit(-666);



    }





/*
  Questo metodo verifica i simboli già presenti nell'operazione ed effettua i calcoli,
  dopodiché visualizza sullo schermo risultato + il parametro s
 */

    String[] numbers;
    DecimalFormat format;

    private void runCalcs(String s) {


        format = new DecimalFormat(precision);

        //l'uguale non deve essere inserito nel calcolo visto che non è un operatore
        if(s=="=") {
            s="";
        }


        if(screen.getText().contains("+"))
        {
            numbers = screen.getText().replace(",", ".").replace("+", "/").split("/", 0);
            result = Double.parseDouble(numbers[0]) + Double.parseDouble(numbers[1]);
            screen.setText((format.format(result)+s).replace(",", "."));
        }
        else if(screen.getText().contains("-"))
        {
            numbers = screen.getText().replace(",", ".").replace("-", "/").split("/", 0);
            result = Double.parseDouble(numbers[0]) - Double.parseDouble(numbers[1]);
            screen.setText((format.format(result)+s).replace(",", "."));
        }
        else if(screen.getText().contains("×"))
        {
            numbers = screen.getText().replace(",", ".").replace("×", "/").split("/", 0);
            result = Double.parseDouble(numbers[0]) * Double.parseDouble(numbers[1]);
            screen.setText((format.format(result)+s).replace(",", "."));
        }
        else if(screen.getText().contains("÷"))
        {
            numbers = screen.getText().replace(",", ".").replace("÷", "/").split("/", 0);
            result = Double.parseDouble(numbers[0]) /Double.parseDouble(numbers[1]);
            screen.setText((format.format(result)+s).replace(",", "."));
        }
        //nessun operatore già presente sullo schermo
        else {
            screen.setText(screen.getText()+s.replace(",", "."));
        }


    }


    // Il seguente metodo verifica se il valore inserito dopo l'operatore è 0, in questo caso non inserisce il valore
    public void set0(String s) {
        splitCheck0 = screen.getText().replace(",", ".").replace(s, "/").split("/", 0);
        if(splitCheck0[1]!="")
            screen.setText(screenText + btnText);
    }






}

Allegati:
30588_f16d681c5318f0da93d40c9902ab6d93.png
30588_f16d681c5318f0da93d40c9902ab6d93.png

30588_b7d90513aac7215aaf4161db7c340f8d.png
30588_b7d90513aac7215aaf4161db7c340f8d.png

30588_20fae1d80f1f1b53f70b811af6985b78.png
30588_20fae1d80f1f1b53f70b811af6985b78.png

30588_c0cfd2223da457a32eabff25fceb3a21.png
30588_c0cfd2223da457a32eabff25fceb3a21.png

4 Risposte

  • Re: Jar prodotto non funzionante

    Apri un prompt dei comandi, posizionati dentro la cartella dove c'è il JAR e dai il seguente comando:

    java -jar MiniCalculator.jar

    Sicuramente uscirà lo stackTrace di un'eccezione. Controllala e se non ne capisci il significato, postala qui.
  • Re: Jar prodotto non funzionante

    Ho capito che manca qualcosa, ma cosa?
    Allegati:
    30588_48f958e1d0d9f9360252c0526ea3480a.png
    30588_48f958e1d0d9f9360252c0526ea3480a.png
  • Re: Jar prodotto non funzionante

    JavaFx, dalla versione 11, non è più integrato nella JRE. Devi scaricare i jar delle javaFX a parte e aggiungerle manualmente al modulepath.

    es, se le librerie jfx sono nella cartella, rispetto al jar "./javafx-sdk-11.0.2" e ti servono i moduli "javafx.base" e "javafx.controls"

    dovrai dare il comando
    java -jar miniCalculator.jar --module-path="javafx-sdk-11.0.2\lib" --add-modules=javafx.base,javafx.controls
  • Re: Jar prodotto non funzionante

    Ok grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte