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

    JPanel al centro di una JFrame full screen

    Ciao a tutti, ho una finestra, JFrame, a tutto schermo (full screen non a dimensioni massimizzate) e ho un JPanel con determinate sue dimensioni.
    Vorrei inserire il JPanel all'interno del JFrame senza cambiargli le dimensioni ma semplicemente mettendolo al centro del JFrame e magari colorare la parte vuota del JFrame di nero.
    Per rendere meglio l'idea allego questa immagine (immaginate che la finestra sia full screen):
    esempioo.jpg

    Come posso fare?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da valentino46 Visualizza il messaggio
    Ciao a tutti, ho una finestra, JFrame, a tutto schermo (full screen non a dimensioni massimizzate) e ho un JPanel con determinate sue dimensioni.
    Vorrei inserire il JPanel all'interno del JFrame senza cambiargli le dimensioni ma semplicemente mettendolo al centro del JFrame e magari colorare la parte vuota del JFrame di nero.
    Se il pannello ha la sua dimensione "preferita" (imposta da te oppure la sua dimensione preferita in base al contenuto), puoi usare GridBagLayout per posizionare il pannello al centro.

    A parole:

    1) Crei un pannelloSfondo (un JPanel), gli setti la proprietà "opaque" a true e la proprietà "background" a Color.BLACK. Inoltre gli setti come layout un GridBagLayout.

    2) Crei il tuo pannelloCentro che deve stare in centro.

    3) Aggiungi il pannelloCentro in pannelloSfondo

    4) Aggiungi il pannelloSfondo nel content pane del JFrame nell'area CENTER del suo BorderLayout.

    Senza passare un GridBagConstraints a GridBagLayout per il tuo pannelloCentro, è già per default "centrato". In generale con GridBagLayout c'è solo un "piccolo" cavillo. Se la finestra fosse troppo piccola per pannelloCentro, GridBagLayout la riduce al suo "minimum" size, ignorando il "preferred" size. Magari non è il tuo caso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie Andbin funziona ma c'è un piccolo problema.
    Vorrei che il pannello interno, quello che tu chiami pannelloCentro, perde sempre il focus e non riesco in alcun modo a riassegnarglielo.
    Come posso fare in modo che il focus sia sempre assegnato al pannelloCentro?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da valentino46 Visualizza il messaggio
    Vorrei che il pannello interno, quello che tu chiami pannelloCentro, perde sempre il focus e non riesco in alcun modo a riassegnarglielo.
    Come posso fare in modo che il focus sia sempre assegnato al pannelloCentro?
    Un "pannello" (intendendo JPanel), di serie non è "focusable" (cioè non può avere il focus). Lo si può rendere focusable ma questo vuol solo dire che può ricevere il focus.
    Quale componente poi ha veramente il focus in un certo momento .... dipende. Un solo componente per volta può avere il focus e l'utente può spostare il focus tipicamente con mouse o ad esempio con il 'tab' da tastiera.
    Quindi precisa cosa vuol dire "sia sempre assegnato al pannelloCentro".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Il JFrame come ti dicevo è a tutto schermo quindi in teoria il focus resta nell'applicazione. All'interno di pannelloCentro non ci stanno componenti grafiche nè nulla se non disegni fatti dal suo paintComponent.
    Dunque la finestra in teoria è così semplicemente composta:
    JFrame -> pannelloSfondo -> pannelloCentro
    poichè ho settato al JFrame pannelloSfondo come contentPane.
    Ho aggiunto un focusListener a pannelloSfondo in cui nel focusGained richiamo pannelloCentro.requestFocusInWindow, analoga cosa ho fatto con il Frame e il suo WindowFocusListener e relativo windowFocusGained ma c'è qualcosa che non funziona.
    Dove sbaglio?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da valentino46 Visualizza il messaggio
    Ho aggiunto un focusListener a pannelloSfondo in cui nel focusGained richiamo pannelloCentro.requestFocusInWindow, analoga cosa ho fatto con il Frame e il suo WindowFocusListener e relativo windowFocusGained ma c'è qualcosa che non funziona.
    Dove sbaglio?
    Se vuoi che pannelloCentro abbia fin da subito (da quando crei la interfaccia) il focus, basta che fai
    pannelloCentro.setFocusable(true);
    e poi
    pannelloCentro.requestFocusInWindow();

    Appena il frame diventa visibile, pannelloCentro avrà il focus. Se pannelloCentro è l'unico componente "focusable" non devi nemmeno preoccuparti del fatto che l'utente possa (volutamente o per sbaglio) spostare il focus. Se anche attiva una finestra di un'altra applicazione e poi ritorna al tuo frame, non c'è dubbio che pannelloCentro riavrà il focus essendo .. l'unico che può avere il focus.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ho risolto!
    In pratica stavo già facendo quanto da te suggerito ma richiamavo il requestFocusInWindow su pannelloCentro prima ancora di infilarlo in pannelloSfondo e quindi nel frame. Posticipando il metodo sopra detto il tutto sembra funzionare.
    Grazie!!

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.