Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    JFrame che si adatta automaticamente

    Salve. Ho una matrice che viene disegnata in un JPanel dove ogni cella ha una dimensione
    prefissata. Per la precisione 15x15 px. Il JPanel è inserito all'interno di un JFrame. All'atto della
    creazione del JFrame l'utente deve poter scegliere le dimensioni della matrice (quadrata) inserendo un numero. Per ora ho impostato io un numero ed ho dovuto adattare il JFrame a tentativi, quindi se
    diminuisco la dimensione della matrice vedo ridurre solo il disegno all'interno, ma il JFrame rimane
    grande quanto le dimensioni che ho impostato. Come potrei fare per far adattare automaticamente
    il JFrame alla dimensione della matrice scelta dall'utente?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Prova a fare un pack() sul frame, in questo modo viene portato alla dimensioni minima per contenere tutto (ma dipende anche da come sono annidati i componenti)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    Come potrei fare per far adattare automaticamente
    il JFrame alla dimensione della matrice scelta dall'utente?
    JFrame (e gli altri componenti top-level che discendono da Window) ha il pack(), che fa una cosa molto semplice: dimensiona la finestra in base al preferred size dei componenti. Quindi se il tuo panel ha (e dovrebbe) gestire appropriatamente il proprio preferred size, puoi fare quello che hai chiesto con il pack.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    In realtà allora il discorso deve essere fatto nei confronti del JPanel. E' su questo che viene disegnata la matrice tramite il metodo paint. Quindi non posso fare preferredSize perché il JPanel deve adattarsi ad un disegno!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    In realtà allora il discorso deve essere fatto nei confronti del JPanel. E' su questo che viene disegnata la matrice tramite il metodo paint. Quindi non posso fare preferredSize perché il JPanel deve adattarsi ad un disegno!
    Ma la dimensione del disegno la calcoli/determini ad un certo punto, no? Quindi puoi fare in modo che il preferred size del JPanel sia impostato con la dimensione del disegno e alla fin fine pack adatterà la finestra in base a quello.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Non calcolo niente di preciso. E' conseguenza del metodo paint che scorre una matrice e disegna di conseguenza in base al suo contenuto.

    codice:
    public void paint(Graphics g) {
            super.paint(g);
    
    
            for (int y = 0; y < dim; y++) {
                for (int x = 0; x < dim; x++) {
                    if (m.getMap(x, y) == 3) {
                        g.drawImage(m.getFinish(), x * 15, y * 15, null);
                    }
                    if (m.getMap(x, y) == 0) {
                        g.drawImage(m.getGrass(), x * 15, y * 15, null);
                    }
                    if (m.getMap(x, y) == 1) {
                        g.drawImage(m.getWall(), x * 15, y * 15, null);
                    }
                }
            }
            g.drawImage(p.getPlayer(), p.getTileX() * 15, p.getTileY() * 15, null);
        }

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    Non calcolo niente di preciso.
    Non centra tanto il paint. C'è un punto/momento nel tuo codice in cui il tuo pannello viene configurato con il numero di celle in orizzontale/verticale e sa anche la dimensione di una cella? Bene, quello sarebbe un momento appropriato per impostare il preferred size.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Ok l'ho fatto nel costruttore del JPanel:

    codice:
    public Board(int d) {
            this.dim = d;
            m = new Maze(dim);
            p = new Player();
            setPreferredSize(new Dimension(dim*15,dim*15));
            addKeyListener(new Al());
            setFocusable(true);
            timer = new Timer(25, this);
            timer.start();
        }
    Di preciso come deve essere la formula? Perché il JFrame assume QUASI le dimensioni giuste, sfallando di una decina di pixel..

    Infatti l'ho risolto così:

    codice:
    setPreferredSize(new Dimension(dim*15-10,dim*15-10));
    Ma mi pare bruttino xD
    Ultima modifica di Javino89; 10-11-2013 a 20:16

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    Di preciso come deve essere la formula? Perché il JFrame assume QUASI le dimensioni giuste, sfallando di una decina di pixel..
    Il tuo pannello Board deve essere in un layout manager, potrebbe ad esempio essere nella parte CENTER del BorderLayout di default nel content-pane del JFrame.

    Nel tuo frame (che dovrebbe essere preferibilmente una classe che estende JFrame) presumo fai/farai una cosa del genere nel costruttore:

    codice:
    public MyFrame() {
        //....
        board = new Board( ... );
        //....
        getContentPane().add(board, BorderLayout.CENTER);
        //....
        pack();
        //....
    }

    Nel preferred size che imposti non è infatti molto bello (e infatti non dovresti) aggiungere delle costanti fisse solo perché "ti sembra" che sfori o non è come ti aspetti. Devi comprendere tutta la questione che riguarda preferred size, layout manager ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    In realtà ho capito cosa provoca il non perfetto dimensionamento. Se imposto che il frame non è ridimensionabile ho il problema, se imposto che è ridimensionabile non ho il problema. Ma io non voglio che la finestra sia ridimensionabile.

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.