Java NetBeans dimensione JFrame dopo compilazione JAR

di il
13 risposte

Java NetBeans dimensione JFrame dopo compilazione JAR

Ho cercato molto su Google ma non ho trovato una risposta al mio problema. Come puoi vedere dall'immagine qui sotto, l'applicazione avviata in modalità debug da NetBeans rispetta le dimensioni che ho assegnato.
IMMAGINE 1

quando compilo il programma e avvio il JAR creato, le dimensioni sono maggiori. Voglio che le dimensioni del JFrame siano sempre quelle assegnate
IMMAGINE 2
ATTENZIONE, NELLA REALTA' L'IMMAGINE 2 E' QUASI IL DOPPIO DELLA 1


questa è la classe

public class MainFrame extends javax.swing.JFrame {

    static Preferences sp;

    /**
     * Creates new form NewJFrame
     */
    public MainFrame() {
        initComponents();

        sp = Preferences.userNodeForPackage(MainFrame.class);

        URL whatismyip = null;
        try {
            whatismyip = new URL("http://checkip.amazonaws.com");
        } catch (MalformedURLException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(
                    whatismyip.openStream()));
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        String ip = null;
        try {
            ip = in.readLine(); //you get the IP as a String
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        if (sp.get("ip", "").equals("")) {
            sp.put("ip", ip);
        }

        if (sp.get("ip", "").equals(ip)) {
            jLabel5.setText("Non cambiato");
            jLabel2.setText(ip);
            jLabel4.setText(ip);
        } else {
            jLabel5.setText("Cambiato");
            sp.put("ip", ip);
            jLabel4.setText(ip);
        }

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        jLabel1.setText("IP attuale");

        jLabel2.setFont(new java.awt.Font("Tahoma", 0, 48)); // NOI18N
        jLabel2.setText("IP attuale");

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        jLabel3.setText("Vecchio IP");

        jLabel4.setFont(new java.awt.Font("Tahoma", 0, 48)); // NOI18N
        jLabel4.setText("Vecchio IP");

        jLabel5.setFont(new java.awt.Font("Tahoma", 0, 80)); // NOI18N
        jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel5.setText("jLabel5");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 893, Short.MAX_VALUE)
                    .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, 893, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addGap(115, 115, 115)
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel4)
                .addGap(44, 44, 44)
                .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 144, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                MainFrame mf = new MainFrame();
                mf.pack();
                mf.setLocationRelativeTo(null);
                mf.setVisible(true);
            }
        });
    }

Allegati:
28552_90cd3bcb14648917a625a2f6d2c221f8.png
28552_90cd3bcb14648917a625a2f6d2c221f8.png

28552_508094fe0714f90195aab05958f68f64.png
28552_508094fe0714f90195aab05958f68f64.png

13 Risposte

  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    CharJw ha scritto:


    Ho cercato molto su Google ma non ho trovato una risposta al mio problema. Come puoi vedere dall'immagine qui sotto, l'applicazione avviata in modalità debug da NetBeans rispetta le dimensioni che ho assegnato.
    IMMAGINE 1

    quando compilo il programma e avvio il JAR creato, le dimensioni sono maggiori. Voglio che le dimensioni del JFrame siano sempre quelle assegnate
    IMMAGINE 2
    Il codice non ha nulla di "strano". Nel senso che è una comune interfaccia con un normale JFrame. Il layout è un GroupLayout, che è complesso/contorto (ma è "colpa" del GUI editor di NetBeans). Ma alla fine viene fatto un pack() quindi dovrebbe stare alla dimensione "preferita". Pertanto NON credo sia il codice in sé il problema.

    Mi vengono in mente altre cose. In NetBeans quale runtime Java sta usando? E quando avvii il jar (immagino da prompt comandi) quale runtime Java utilizzi? Inoltre: stai forse usando un display in "high-dpi"? Per intenderci tipo un 15 pollici con la Full HD 1920x1080 ?
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    Queste sono le informazioni di NetBeans:

    Product Version: NetBeans IDE 8.2 RC (Build 201609140952)
    Updates: NetBeans IDE is updated to version NetBeans 8.2 Patch 2
    Java: 1.8.0_231; Java HotSpot(TM) 64-Bit Server VM 25.231-b11
    Runtime: Java(TM) SE Runtime Environment 1.8.0_231-b11
    System: Windows 10 version 10.0 running on amd64; Cp1252; it_IT (nb)
    User directory: C:\Users\Besitzer\AppData\Roaming\NetBeans\8.2rc
    Cache directory: C:\Users\Besitzer\AppData\Local\NetBeans\Cache\8.2rc

    questa è la versione su pc
    Versione 8 aggiornamento 251 (build 1.8.0 251_b08

    Secondo me è un problema durante la compilazione del JAR, ho provato altri pc e il risultato è sempre lo stesso.
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    CharJw ha scritto:


    Secondo me è un problema durante la compilazione del JAR
    No, NON è un problema di "compilazione" (né di generazione del jar).

    Quando lanci il jar "a mano" metti:

    java -Dsun.java2d.dpiaware=true -jar tua-app.jar

    Se la finestra si vede più "piccola" (come in NetBeans), allora sappi che la questione riguarda appunto il high-dpi e/o comunque il fattore di zoom impostabile in Windows 10
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    È vero lanciando quel comando le dimensioni sono quelle effettive.

    Esiste un modo per fare il build del JAR che non tenga conto dei dpi degli schermi?

    Cioè, voglio che l'app abbia le dimensioni predefinite a prescindere dalla risoluzione di qualsiasi schermo in uso.
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    CharJw ha scritto:


    Esiste un modo per fare il build del JAR che non tenga conto dei dpi degli schermi?

    Cioè, voglio che l'app abbia le dimensioni predefinite a prescindere dalla risoluzione di qualsiasi schermo in uso.
    Guarda, non sono sicuro (e non credo) che esista una soluzione unica/definitiva. La gestione della property sun.java2d.dpiaware è stata aggiunta nel JDK 8u211 (vedi release note di JDK 8u211).
    Nei JDK più recenti (es. 11, 12 ecc..) questa property non è più gestita, da quanto ho letto, a favore del "manifest" interno agli eseguibili java(w). Ma viene gestita un'altra property, ho visto, che è sun.java2d.uiScale=N (N un valore es. 1 o 1.5 o 3 ecc...).

    Per lavoro mi è stato dato un notebook Windows 10 che ha un 15 pollici purtroppo in Full HD ovvero 1920x1080 (quindi "high-dpi"). Ed ho dovuto impostare in Windows lo zoom globale del 150% altrimenti mi ci "cavo gli occhi".
    Avendo svariati JDK (dal 5 fino al 14) sulla macchina ho fatto un po' di prove con una piccola app con 1 JFrame fatto al volo.
    Se metto nel main all'inizio, come prima cosa queste impostazioni:
    public static void main(String[] args) {
        System.setProperty("sun.java2d.dpiaware", "true");
        System.setProperty("sun.java2d.uiScale", "1");
        // ......
    
    Ottengo un comportamento che è perlomeno coerente con tutti i JDK che ho, ovvero la finestra è "piccola", NON zoomata ingrandita.

    Ma non so/posso dire se queste impostazioni possano valere in tutti gli scenari e per tutti i vari S.O. (compresi Linux/Mac).
    Fai qualche prova e verifica. Purtroppo i monitor in high-dpi sono sempre più frequenti e ci sono grane di questo tipo ..
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    Dunque il problema sembra risolto in parte. Nel progetto di esempio che hai visto, funziona (progetto java Application)
    In un altro progetto gradle che ho, sembra non avere il minimo effetto, cioè il frame non rispetta le dimensioni impostate.....è davvero frustrante!
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    CharJw ha scritto:


    In un altro progetto gradle che ho, sembra non avere il minimo effetto, cioè il frame non rispetta le dimensioni impostate.....è davvero frustrante!
    Ma Gradle (o Maven o che altro) non dovrebbe proprio c'entrare nel senso generale della fase di build. C'entra invece sicuramente il S.O., le sue impostazioni di scaling ecc..., il JDK/JRE usato per l'avvio della applicazione e eventualmente come/da dove viene avviata la applicazione.
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    Faccio un riepilogo, utilizzando sempre lo stesso PC, ho inserito
    
      System.setProperty("sun.java2d.dpiaware", "true");
      System.setProperty("sun.java2d.uiScale", "1");
    
    nel metodo main, prima di richiamare ogni altra cosa.
    faccio Clean and Build con un semplice progetto Java come quello che ho scritto nel vecchio post.
    Avvio con doppio click il JAR creato e le dimensioni restano quelle che ho impostato.

    Facendo la stessa cosa con un progetto gradle, il codice da te suggerito non ha alcun effetto.
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    Rettifico che se il progetto gradle, lo avvio da riga di comando come hai suggerito, funziona.
    Ora il problema resta, come faccio a far avviare il JAR all'utente senza doppio click ma da riga di comando?
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    CharJw ha scritto:


    Rettifico che se il progetto gradle, lo avvio da riga di comando come hai suggerito, funziona.
    Ora il problema resta, come faccio a far avviare il JAR all'utente senza doppio click ma da riga di comando?
    In che senso? Non ho ben capito ...
    Poi comunque non ci dovrebbe essere differenza tra l'avvio del jar da prompt oppure da doppio-click in un "esplora risorse". L'unica differenza "tecnica" su Windows è che l'installer del runtime Java installa l'associazione per .jar verso C:\blabla\bin\javaw.exe che è il launcher della JVM senza console.
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    Spiego meglio dove voglio arrivare.
    Dato che se l'utente avvia il JAR con doppio click, le dimensioni effettive non vengono rispettate, invece se avvia da riga di comando si.

    Mettiamo che Mario Rossi sia l'utente che deve utilizzare l'app e deve avviare il JAR da riga di comando, ma ovviamente non ha la minima idea di come fare, devo creargli una specie di collegamento che con doppio click avvia il JAR da riga di comando.

    Esiste questa possibilità?
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    CharJw ha scritto:


    Dato che se l'utente avvia il JAR con doppio click, le dimensioni effettive non vengono rispettate
    Ma è questo il punto che non capisco. Perché mai dovrebbe essere differente? Verifica cosa c'è associato alla estensione .jar (lo si vede bene dal regedit di Windows ma devi sapere cosa/dove rintracciare)

    CharJw ha scritto:


    ma ovviamente non ha la minima idea di come fare, devo creargli una specie di collegamento che con doppio click avvia il JAR da riga di comando.
    Banalmente un .bat o anche un collegamento. Magari tramite un "installer". Ma questo è un altro discorso.
  • Re: Java NetBeans dimensione JFrame dopo compilazione JAR

    Avevo fatto un errore nell'app creata con gradle....tutto funziona come previsto.
    Grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte