Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema con setExtendedState e Mac

    ciao!

    ho settato nel mio JFrame il setResizable(false).
    a questo punto nel costruttore faccio questo:
    codice:
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    su windows e linux nessun problema.
    invece sul mac, non si prende lo stato di esteso.
    a meno che non faccia questo:
    codice:
            SwingUtilities.invokeLater(() -> {
                setResizable(true);
                setExtendedState(JFrame.MAXIMIZED_BOTH);
                setResizable(false);
            });
    così funziona, ma non è che mi piaccia un granchè.
    avete idea del perchè??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    setExtendedState lo esegui prima o dopo setVisible(true) ?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    setExtendedState lo esegui prima o dopo setVisible(true) ?
    uhm dopo.
    il frame lo richiamo da un'altra classe (Main) che ha il metodo main.
    codice:
    MyFrame mf = new Myframe();
    mf.setVisible(true);
    in sostanza è il frame principale dall'applicazione.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    uhm dopo.
    Meglio prima. Il setVisible(true) dovrebbe essere generalmente l'ultima cosa da fare.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
    MyFrame mf = new Myframe();
    mf.setVisible(true);
    Questo lo fai nel EDT?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Premetto che non ho praticamente quasi mai usato setExtendedState. E mi correggo. Questo su Windows 7 funziona:

    codice:
    import javax.swing.*;
    
    public class Prova {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame f = new JFrame("Prova");
                    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                    f.setResizable(false);
                    f.setVisible(true);
                    f.setExtendedState(JFrame.MAXIMIZED_BOTH);
                }
            });
        }
    }

    Ma nota che se metto il setExtendedState prima del setVisible(true), allora non funziona.

    P.S. prova il codice su Mac .. io non ho possibilità.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiornamento

    Ho provato a stampare lo state nel mio esempio:

    codice:
    System.out.println(f.getExtendedState());
    f.setVisible(true);
    System.out.println(f.getExtendedState());
    f.setExtendedState(JFrame.MAXIMIZED_BOTH);
    System.out.println(f.getExtendedState());
    Che funziona e mi stampa
    0
    0
    6

    (il 6 è il valore di MAXIMIZED_BOTH)

    Ma se metto il setExtendedState prima del setVisible:

    codice:
    System.out.println(f.getExtendedState());
    f.setExtendedState(JFrame.MAXIMIZED_BOTH);
    System.out.println(f.getExtendedState());
    f.setVisible(true);
    System.out.println(f.getExtendedState());
    Ottengo:
    0
    6
    0

    Sembra quindi che il MAXIMIZED_BOTH si "perda" con il setVisible. Quindi il linea di massima: è corretto il setExtendedState dopo il setVisible

    P.S. adesso che mi viene in mente, sono sicuro di aver letto qualcosa a riguardo in passato ... ma ovviamente non saprei ricordare dove.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    allora, questo il main:
    codice:
    public class Main {
    
        public static void main(String args[]) {
                try {
                    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
                EventQueue.invokeLater(() -> {
                    new FrameStart().setVisible(true);
                });
        }
    }
    poi in FrameStart:
    codice:
        public FrameStart() {
            // SETTAGGI VARI
    
            // LINUX E WINDOWS
            setExtendedState(JFrame.MAXIMIZED_BOTH);
    
            // MAC OS X
            SwingUtilities.invokeLater(() -> {
                setResizable(true);
                setExtendedState(JFrame.MAXIMIZED_BOTH);
                setResizable(false);
            });
        }
    leggendo in giro, alcuni ritengono che il problema possa essere il setSize / setPreferredSize.
    appena ho il mac sottomano, provo a levare tutte le varie istruzioni che impostano le dimensioni per vedere se è quello.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il codice che hai postato tu esegue setExtendedState prima del setVisible(): prima viene invocato il costruttore, poi il Frame viene reso visibile. Stando alle indicazioni che ti ha dato andbin nei messaggi precedenti, dovresti spostare l'invocazione di setExtendedState() DOPO il setVisible(true), quindi non nel costruttore.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    ciao a tutti e buon anno!

    allora, ho levato l'istruzione dal costruttore e l'ho messa dopo il setVisible.
    per farlo funzionare devo cmq settare il resizable:
    codice:
                try {
                    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
                EventQueue.invokeLater(() -> {
                    FrameStart fs = new FrameStart();
                    fs.setVisible(true);
                    fs.setResizable(true);
                    fs.setExtendedState(JFrame.MAXIMIZED_BOTH);
                    fs.setResizable(false);
                });
    quindi, per evitare doppioni, dovrei levare l'istruzione setResizable dal costruttore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.