Problema con la dimensione di un jframe

di il
5 risposte

Problema con la dimensione di un jframe

Ciao a tutti, scusate il disturbo e l'inisperienza. sono qui perchè sono giorni che sto cercando di risolvere questo problema ma non ne vengo fuori.

sto cercando di creare un'applicazione dove in un JFrame vengono creati 6 identici JPanel, disposti in matrice 3x2, con all'interno alcuni bottoni ed etichette, una cosa abbastanza semplice insomma. Il problema nasce nel fatto che questa GUI la vorrei poter utilizzare in diversi dispositivi e schermi, e vorrei quindi dimensionare tutti i pannelli all'interno dei JFrame (quindi tutte le varie JLabel e i JButton) in funzione delle dimensioni "sfruttabili" dello schermo di quel preciso dispositivo.

Ho provato ad utilizzare due strade ma nessuna delle due si è rivelata ottima. All'inizio avevo fatto tutto in funzione di screenSize.width e screenSize.height. Mentre per la larghezza ha funzionato, per l'altezza questo metodo mi restituisce tutta l'altezza dello schermo, compresa la "title bar" del JFrame e la barra di Windows, quindi ovviamente non va bene. Poi ho provato con getMaximumWindowBounds() di GraphicsEnvironment che mi restituisce il rettangolo "sfruttabile", quindi tutto lo schermo esclusa la barra di windows: la "title bar" (e poi anche lo spazio occupato dal JMenu, perchè c'è anche quello) però purtroppo continua a rimanere compresa...

cosa mi consigliate di fare? come potrei riuscire a risalire alle dimensioni dello spazio del JFrame che veramente riesco ad utilizzre?
Aggiungo che utilizzo SetExtendedState(JFrame.MAXIMIZED_BOTH) e setResizable(false) che mi setta il frame full screen senza possibilità di ridimensionare...

Vi prego inoltre di dirmi se ho spiegato male il problema e se magari ho dato per scontato qualcosa che invece sarebbe stato importante che scrivessi.

5 Risposte

  • Re: Problema con la dimensione di un jframe

    accosimo ha scritto:


    All'inizio avevo fatto tutto in funzione di screenSize.width e screenSize.height. Mentre per la larghezza ha funzionato, per l'altezza questo metodo mi restituisce tutta l'altezza dello schermo, compresa la "title bar" del JFrame e la barra di Windows, quindi ovviamente non va bene.
    getScreenSize() di Toolkit fornisce la dimensione reale dello schermo (tra l'altro se il sistema è multi-monitor, usa solo il monitor "primario").

    L'equivalente di getScreenSize() (ma nell'ottica multi-monitor) è getBounds() di GraphicsConfiguration.

    getScreenInsets(GraphicsConfiguration) di Toolkit fornisce gli Insets, ovvero quanto sottrarre dai 4 lati per ottenere lo spazio libero, non occupato da toolbar/menù di sistema.

    accosimo ha scritto:


    Poi ho provato con getMaximumWindowBounds() di GraphicsEnvironment che mi restituisce il rettangolo "sfruttabile", quindi tutto lo schermo esclusa la barra di windows: la "title bar" (e poi anche lo spazio occupato dal JMenu, perchè c'è anche quello) però purtroppo continua a rimanere compresa...
    Hai tenuto conto che getMaximumWindowBounds restituisce un Rectangle in cui ci sono anche x/y da tenere in considerazione?

    Ma a parte questo, ti faccio presente una cosa: un conto è la dimensione della finestra, un altro è la dimensione del "content pane" di JFrame. Se imponi la dimensione del JFrame e i tuoi pannelli li hai messi in un (immagino) GridLayout nel content pane, essi si spartiscono la dimensione del content pane, che è già "a meno" di menubar/bordi.
  • Re: Problema con la dimensione di un jframe

    andbin ha scritto:


    Hai tenuto conto che getMaximumWindowBounds restituisce un Rectangle in cui ci sono anche x/y da tenere in considerazione?
    sisi ne ho tenuto conto, ma comunque le coordinate del top left corner (x,y) del rect che mi restituisce sono (0,0)

    andbin ha scritto:


    Ma a parte questo, ti faccio presente una cosa: un conto è la dimensione della finestra, un altro è la dimensione del "content pane" di JFrame. Se imponi la dimensione del JFrame e i tuoi pannelli li hai messi in un (immagino) GridLayout nel content pane, essi si spartiscono la dimensione del content pane, che è già "a meno" di menubar/bordi.
    io non ho utilizzato nessun gridLayout ora che mi ci fai pensare, non ci ho pensato e non credevo servisse. Ho direttamente preso un JPanel pan, ci ho "aggiunto" i 6 mieiPannelli() come fossero una matrice 3x2, ognuno con base un terzo della dimensione orizzontale dello schermo e di altezza un mezzo della dimensione verticale dello schermo in modo da occupare il maggior spazio possibile a loro disposizione e poi ho passato il JPanel pan al contentPane
    fin.setContentPane(pan);
    con fin il nome del JFrame...

    ...solo che essendo le dimensioni dello schermo diverse dalla porzione di schermo che posso occupare, ovviamente si vanno a creare dei problemi (ripeto, non tanto in orizzontale visto che le due cose coicidono, quanto in verticale data la presenza di porzioni di schermo che non posso sfruttare).


    tornando al tuo consiglio, mi proponi di utilizzare un gridLayout visto che questo fa in modo di dividere automaticamente lo spazio a disposizione nel JFrame (ipotizzando che il JFrame è inizializzato a tutto schermo)? giusto? mi devo andare a vedere la documentazione visto che non è mia abitudine (a questo punto cattiva abitudine) utilizzare il gridLayaut...
  • Re: Problema con la dimensione di un jframe

    accosimo ha scritto:


    sisi ne ho tenuto conto, ma comunque le coordinate del top left corner (x,y) del rect che mi restituisce sono (0,0)
    Sì, ok era solo per chiarire. Anche ad esempio sul mio sistema inizia a (0,0), dopotutto su Windows è più raro che qualcuno metta toolbar in alto/sinistra/destra.

    accosimo ha scritto:


    io non ho utilizzato nessun gridLayout ora che mi ci fai pensare, non ci ho pensato e non credevo servisse. Ho direttamente preso un JPanel pan, ci ho "aggiunto" i 6 mieiPannelli() come fossero una matrice 3x2, ognuno con base un terzo della dimensione orizzontale dello schermo e di altezza un mezzo della dimensione verticale dello schermo in modo da occupare il maggior spazio possibile a loro disposizione e poi ho passato il JPanel pan al contentPane
    Tecnicamente, la dimensione "reale" del content pane la puoi anche ottenere, se vuoi. Basta che dopo aver dimensionato il JFrame (setSize), rendi il frame "displayable" (dalla documentazione javadoc: A component is displayable when it is connected to a native screen resource.) utilizzando setVisible(true) (vale anche con pack() ma in questo caso non è questo che ti serve).
    Appena dopo che hai fatto setVisible(true) sul JFrame, la dimensione "reale" del content pane è disponibile.

    Ma il punto è che se non usi un layout manager, devi farti comunque un po' di calcoli.

    accosimo ha scritto:


    tornando al tuo consiglio, mi proponi di utilizzare un gridLayout visto che questo fa in modo di dividere automaticamente lo spazio a disposizione nel JFrame (ipotizzando che il JFrame è inizializzato a tutto schermo)? giusto?
    Sì, sarebbe molto meglio se usi un layout manager e visto che hai parlato di griglia 3x2, il GridLayout è appropriato. Tieni comunque presente, che siccome tu imponi la dimensione del JFrame, il GridLayout andrà a suddividere quella dimensione (meno bordi, menù ...) senza domandare nulla, riguardo le dimensioni, ai componenti contenuti.

    accosimo ha scritto:


    mi devo andare a vedere la documentazione visto che non è mia abitudine (a questo punto cattiva abitudine) utilizzare il gridLayaut...
    Detto in generale: salvo casi davvero particolari (che esistono certamente), sarebbe sempre meglio sfruttare uno o più layout manager. È meno facile riuscire a individuare subito il/i layout manager adatto/i per un certo layout ma alla lunga hai molti vantaggi (meno calcoli, codice più pulito, ridimensionamento automatico).
  • Re: Problema con la dimensione di un jframe

    andbin ha scritto:


    Sì, sarebbe molto meglio se usi un layout manager e visto che hai parlato di griglia 3x2, il GridLayout è appropriato. Tieni comunque presente, che siccome tu imponi la dimensione del JFrame, il GridLayout andrà a suddividere quella dimensione (meno bordi, menù ...) senza domandare nulla, riguardo le dimensioni, ai componenti contenuti.

    andbin ha scritto:


    Detto in generale: salvo casi davvero particolari (che esistono certamente), sarebbe sempre meglio sfruttare uno o più layout manager. È meno facile riuscire a individuare subito il/i layout manager adatto/i per un certo layout ma alla lunga hai molti vantaggi (meno calcoli, codice più pulito, ridimensionamento automatico).
    ci sono appena riuscito non voglio cantar vittoria troppo presto, dovrò aspettare domani a mente lucida, ma sembra che tutto funzioni e sia molto più semplice!!! grazie mille veramente, soprattutto per la rapidità delle risposte!!!!

    andbin ha scritto:


    Tecnicamente, la dimensione "reale" del content pane la puoi anche ottenere, se vuoi. Basta che dopo aver dimensionato il JFrame (setSize), rendi il frame "displayable" (dalla documentazione javadoc: A component is displayable when it is connected to a native screen resource.) utilizzando setVisible(true) (vale anche con pack() ma in questo caso non è questo che ti serve).
    Appena dopo che hai fatto setVisible(true) sul JFrame, la dimensione "reale" del content pane è disponibile.

    Ma il punto è che se non usi un layout manager, devi farti comunque un po' di calcoli.
    mi hai dato un buono spunto di riflessione anche da questo punto di vista. proverò a vedere se qualcosa si sarebbe potuto tirare fuori anche con questa strada...chissà se mai potrà essermi utile! grazie veramente!!!
  • Re: Problema con la dimensione di un jframe

    Alla fine ho risolto sia utilizzando il gridLayout sia utilizzando la dimensione del contentPane, in modo da non avere nessuna errore di sorta. Solo con il grid layout, riuscivo a posizionare bene i pannelli, dove sarebbero dovuti essere, però mi tagliava la parte bassa, visto che la base e l'altezza dei panelli da inserire nel gridLayout erano più grandi dello spazio che effettivamente il gridLayout gli risevava. Per determinare la base e l'altezza dei panel utilizzavo ancora getMaximumWindowBounds() di GraphicsEnvironment. Ora con getContentPane().getWidth() getContentPane().getHeight() tutto funziona alla perfezione! Grazie ancora!!!
Devi accedere o registrarti per scrivere nel forum
5 risposte