Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2006, 15:51   #1
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
[JAVA] Dimensioni JFrame

Sto cercando il modo di fare ingrandire una frame una volta che è già stata creata...
Ok, lo so che detta così non si capisce molto..diciamo che ho creato
un gioco e alla fine di ogni livello il gioco deve ingrandirsi anche se
per il momento si ingrandisce il pannello ma non il contenitore (la frame) e dunque il tutto viene visualizzato "spezzato"..
Secondo voi è possibile??
Ho già provato a inserire un ulteriore setSize ma senza grandi
risultati.
Aspetto con impazienza una vostra risposta.
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2006, 16:24   #2
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Bhe a ridimensionare un Jframe non ci dovrebbero essere grossi problemi, usi un setSize come hai già detto te.
Cosa devi ottenere di preciso e cosa invece non ottieni?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 08:04   #3
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
NO, non funziona...
il problema è che se faccio partire il gioco direttamente da livelli successivi la frame appare più grande dell'originale ma partendo dal primo e aspettando che si ingrandisce non lo fa.
Prova a vedere se costruendo una frame e dando invio questa cambia le sue dimensioni.
Come non detto ho appena provato a costruirla e funziona, dunque è un problema di dove ho messo la variabile che incrementa le dimensioni.

Ultima modifica di fefott : 21-09-2006 alle 08:52.
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 10:40   #4
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
Ora che sono riuscita a far aumentare la frame ho un altro piccolo problema. Per spiegarlo allego un immagine...poichè è meglio di 1000 parole.
Aspetto suggerimenti.
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 12:34   #5
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Nn vedo l'immagine sec me ti sei dimenticata di allegarla
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 15:24   #6
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
Ci sto provando tutta la mattina...ma sembra non voler allegare nessuna immagine...ad ogni modo puoi vederla da qui: http://forum.html.it/forum/showthrea...readid=1032237
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 15:27   #7
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
In pratica hai il JFrame + grande dell'area su cui disegni?
Dimmi, su cosa disegni? Usi un JPanel?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 16:42   #8
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
NO, la frame ora è della dimensione giusta per ospitare l'intero labirinto che come si vede dalla figura appare spezzato..in pratica è più grande solo non vedo il pezzo aggiunto poichè oscurato dal colore di sfondo della frame.
SI, disegno su un JPanel.
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 17:41   #9
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Dalle tue parole sembra che hai la frame nera, quindi il tuo jpanel non è delle dimensioni del jframe.
Per capirci, fammi uno screen con il jpanel di colore diverso dal frame!

Se invece è il tuo Jpanel ad essere nero, e come dici te è delle stesse dimensioni del jframe, allora bisogna che mi dici come disegni il labirinto, cioè voglio sapere se per disegnare l'area di gioco utilizzi qualche variabile che dipende dalle dimensioni del jframe.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2006, 23:17   #10
TellaspallaBob
Member
 
L'Avatar di TellaspallaBob
 
Iscritto dal: Nov 2002
Messaggi: 262
Allora io non ho molto ben capito quello che vuoi fare, perchè per dimensionare un Frame, basta fare un setSize o un setBounds, non capisco se il problema è l'auto riposizionamento dei componeti perchè in tal senso basta usare i LayoutManager; quindi penso che il tuo sia un problema di disegno grafico.
Ti faccio una piccola teoria sulle swing e su alcuni oggetti grafici AWT e su come si usano per disegnare.

Una JFrame è un oggetto complesso fatto da JRootPane, JLayeredPane GlassPane e soprattuto l'unico che a te interessa realmente il ContentPane...

Il ContentPane (è solo un concetto, in realta di solito è un JPanel o un oggetto che deriva da un JComponent o un Container AWT) è quello che appunto ospita tutti i componenti del frame.

Velocemente è quello l'oggetto che tu devi prendere in esame per il disegno.

Ma andiamo oltre....
Se devi disegnare qualcosa estendi un JPanel e ridefinisci il metodo paintComponent(Graphics g)

Tieni presente che sempre la tua prima istruzione che in tal metodo dovrà essere una chiamata al metodo padre quindi: super.paintComponent(g)
questo permetterà al pannello di eseguire correttamente le sue operazioni di refresh di base.

Tale metodo viene sempre richiamato dal Thread Grafico di Java qualora servisse: sposti la schermata, la ridimensioni, la deiconizzi etc. e dal metodo repaint() che puoi richiamare a tuo piacimento.

In tal metodo puoi sapere sempre la dimensione del pannello su cui stai andando a disegnare

protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Dimension dimPanel = getPreferredSize();

// Ora fai tutto quello che vuoi con l'oggetto Grafico.
}

Come vedi ho usato il getPreferredSize perchè nei LayouManager i componenti non sono soggetti al setSize ma al preferred, minimum, e maximum size.

un consiglio poi è quello di usare i BufferedImage i quali hanno un loro oggetto Graphics che ti permette di disegnarci sopra.
Questi sono utili per evitare i flichers dell'immagine.
In più ti permettono di avere un rendering molto ampio della tua scena (precalcolato) per poi farti dare solo un crop dell'immagine che ti serve da sparare sul contenitore su cui visualizzarla.... tecnica del double-buffering!!!

Ah dimenticavo, la teoria sopra è in generale per i componeti che derivvano da JComponent, per quelli AWT basta ridefinire il paint(Graphics g)
valgono le stesse regole per il double buffering ma non per la chiamata al metodo padre anche se non è sconsigliata

Breve esempio
Se hai dubbi chiedi... spero di esserti stato utile.

public class ImageViewer extends JFrame
{
ImapePanel imgPanel = null;

public ImageViewer()
{
super();
setSize(640, 480);

imgPanel = new ImagePanel();
imgPanel.setImage(new ImageIcon("Prova.gif").getImage());
setContentPane(imgPanel);
}
}

class ImagePanel extends JPanel
{
Image imgage = null;

public ImagePanel ()
{
super();
}

public void setImage(Image img)
{
this.image = img;
repaint();
}


protected void paintComponent(Graphics g)
{
// Ci sono casi in cui il componente grafici non è stato ancora creato
if(g == null || image == null) return;

super.paintComponent(g);

g.drawImage(......image);
}
}
TellaspallaBob è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 09:30   #11
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
mmmm secondo me, viste le risposte non mi sono spiegata per niente bene...e se le immagini sono 1000 volte meglio delle parole, il codice lo è molto di più dunque...
Nella classe che estende JPanel ho:

public void paintComponent(Graphics g)
{
super.paintComponent(g);
init();

if(game.getStatus() == game.START)
drawStart();

else if (game.getStatus() == game.GAME)
{
drawLabyrinth();
drawProtagonist();
drawAdversary();
drawScore();
drawBonus();
}

else if(game.getStatus() == game.NEXT)
drawNext();

else if (game.getStatus() == game.OVER)
drawOver();

else if (game.getStatus() == game.WIN)
drawWin();

g.drawImage(bufferImage, 0, 0, this);
}

/**
*
*/
public void init()
{
rows = game.maze.getRows();
cols = game.maze.getCols();
sizeCell = setting.sizeCell;
xOff = setting.xOff;
yOff = setting.yOff;

xMaze = cols * sizeCell;
yMaze = rows * sizeCell;

xCanvas = xMaze + xOff*2 ;
yCanvas = yMaze + yOff*2;

// Array di immagini
nImage = setting.nImage;
bonus = new Image[setting.nBonus];
// Carica le immagini
getImages();

bufferImage = createImage(getSize().width, getSize().height);
buffer = bufferImage.getGraphics();
}

------------------------------------------------------------------------

Mentre nella classe JFrame ho:

private void init()
{
setTitle("PacArcade");

// Impedisce il ridimensionamento della frame.
setResizable(false);

// Termina con la chiusura della frame.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setting = new Setting();
game = new ControlGame(setting);
panel = new LabyrinthPanel(setting, game);

// Determina le dimensioni della frame.
int xFrame = setting.xOff*3 + game.maze.getCols() * setting.sizeCell;
int yFrame = setting.yOff*3 + game.maze.getRows() * setting.sizeCell + panel.DIM_SCORE*3;

setSize(xFrame, yFrame);

// Centra la finestra sullo schermo.
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-this.getWidth())/2 ,
(Toolkit.getDefaultToolkit().getScreenSize().height-this.getHeight())/2);

// Dentro ogni frame c'è un container recuperabile con metodo getContentPane().
Container c = getContentPane();
setBackground(BACKGROUND_COLOR);

// I nuovi componenti vanno aggiunti al container.
c.add (panel);
}

-----------------------------------------------
Il labirinto al primo livello è perfetto, viene visualizzato benissimo...lo stesso avviene se faccio finta di partire dal secondo con le dimensioni ingrandite sia del labirinto sia del frame..il problema avviene se parto dal primo livello arrivo alla fine del labirinto e passo al livello successivo..il labirinto si ingrandisce, la frame anche ma il pezzo "aggiunto" non riesco a visualizzarlo.
Spero di essere stata chiara.
Grazie a tutti quelli che verranno in mio soccorso.
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 13:23   #12
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Prova a stampare le dimensione del bufferImage getSize().width e getSize().height (ti conviene usare getWidth() e getHeight() in quanto non allocano nessun oggetto) e vedi se corrispondono alle dimensioni del JFrame...

Io dico che hai il JPanel più piccolo...rendilo opaco così lo vedi...
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 14:40   #13
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
Hai ragione, si ingrandisce il labirinto ma non il JPanel...ma...non mi viene in mente una soluzione...idee??
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 14:41   #14
TellaspallaBob
Member
 
L'Avatar di TellaspallaBob
 
Iscritto dal: Nov 2002
Messaggi: 262
Uhmmm secondo mo deve esserci qualche inesattezza nei passaggi....

Il codice ovviamente non può essere completo per analizzarlo ma da quello che vedo non mi sembra ci siano errori di sorta.

Anzi prima cosa... non ho potuto vedere l'immagine di cui parli perché il sito su cui l'hai postata richiede l'iscrizione per vederla.... se hai possibilità di inserirla qui è meglio.

Ad occhio penso che sia un problema di tempi, nel senso che non vorrei che tu dimensionassi il buffere image prima che il frame venga dimensionato per il livello successivo.

Nel paint tu gestisci la casistica next e game, spero che in quel next tu non setti la nuova dimensione del frame perchè a quel punto l'init del buffer è già fatto!!!

PS piccolo consiglio, nel paint tu devi solo renderizzare niente logiche di controllo...
TellaspallaBob è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 14:51   #15
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
Ho riprovato a rimettere l'immagine, spero si veda..
per quanto riguarda next e game no, non è lì che aumento le dimensioni, sono solo due variabili che mi permettono di cambiare la schermata di passaggio di livello e se è nel gioco la visualizzazione dello stesso. Ho come l'impressione che abbia visto giusto Memon quando dice che secondo lui il JPanel rimane piccolino e non si ingrandisce...ma non so come fare per aggiornare le sue dimensioni (sempre sia quello il problema)..
Suggerimenti??
Immagini allegate
File Type: gif problemaFrame.GIF (18.1 KB, 9 visite)
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 15:02   #16
TellaspallaBob
Member
 
L'Avatar di TellaspallaBob
 
Iscritto dal: Nov 2002
Messaggi: 262
ok ok!!!

Ora capisco!!!

1 - Il panel lo setti direttamente nel JFrame principale giusto?
Quindi nel tuo JFRame principale avrai una cosa tipo getContentPane().add(panelGioco);

2 - Se si, che LayoutManager hai settato nel ContentPane?
Se leggi il mio primo post, ti dicevo che in java o usi i LayoutManager e quindi devi utilizzare i set e get PreferredSize o lio disabiliti e puoi usare allora i set e get Size....

3 - Se no hai fatto istruzioni tipo getContetPane().setLayou(null) allora di default il ContentPane che è un Conatiner usa un LayoutManeger di tipo FlowLayout...

4 - Soluzioni:
s1 - disabiliti i layout, ma poi il resize te lo devi calcolare tutto a manella.
s2 - non leggi e non setti le dimensioni del pannello mediante set e get size ma mediante set e get PreferredSize che usano oggetti di tipo Dimension
TellaspallaBob è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 15:13   #17
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
Allora....come richiamo il tutto l'ho scritto prima...

Mentre nella classe JFrame ho:

private void init()
{
setTitle("PacArcade");

// Impedisce il ridimensionamento della frame.
setResizable(false);

// Termina con la chiusura della frame.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setting = new Setting();
game = new ControlGame(setting);
panel = new LabyrinthPanel(setting, game);

// Determina le dimensioni della frame.
int xFrame = setting.xOff*3 + game.maze.getCols() * setting.sizeCell;
int yFrame = setting.yOff*3 + game.maze.getRows() * setting.sizeCell + panel.DIM_SCORE*3;

setSize(xFrame, yFrame);

// Centra la finestra sullo schermo.
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-this.getWidth())/2 ,
(Toolkit.getDefaultToolkit().getScreenSize().height-this.getHeight())/2);

// Dentro ogni frame c'è un container recuperabile con metodo getContentPane().
Container c = getContentPane();
setBackground(BACKGROUND_COLOR);

// I nuovi componenti vanno aggiunti al container.
c.add (panel);
}

Per quanto riguarda le tue soluzioni...help...ora me le rileggo con calma e provo a vedere come applicarle...
Grazie per l'aiuto che mi stai dando.
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 15:47   #18
TellaspallaBob
Member
 
L'Avatar di TellaspallaBob
 
Iscritto dal: Nov 2002
Messaggi: 262
Quote:
Originariamente inviato da fefott
Mentre nella classe JFrame ho:

private void init()
{

...........
........

panel = new LabyrinthPanel(setting, game);

.......
........

// Dentro ogni frame c'è un container recuperabile con metodo getContentPane().
Container c = getContentPane();

setBackground(BACKGROUND_COLOR);

// I nuovi componenti vanno aggiunti al container.
c.add (panel);
}
Nel tuo codice non specifici al ContentPane il tipo di Layout usare, quindi lui userà il suo di default cioè il FlowLayout.

soluzione 1 Senza Layoutmanager

class MasterFrame extends JFrame
{
// Riferimento globale al pannello di gioco
PanelGame pnlGame = null;

public MasterFrame()
{
super();

// Disabilito il LayoutManager, ma a questo punto se
// Sei tu che devi gestire uno ad uno tutti i componenti ad esso
// aggiunti.
getContentPane().setLayout(null);

// Creo l'istanza del pannello di gioco
pnlGame = new PanelGame(....parametri....);

// Aggiungo il pannello di gioco al frame.
getContentPane().add(pnlGame);
}


// setto la nuova dimensione del pannello
private void setDimensionePannelloDiGioco(int w, int h)
{
pnlGame.setSize(w,h);

// Ricorda che la variazione di dimensione di un oggetto
// non implica necessariamente il suo ridisegno.
// Se vuoi essere certa fai un bel repaint()
}
}

class PanelGame extends JPanel
{
protected void paintComponent(Graphics g)
{
super.paintComponent(g);

// Visto che le dimensioni sono fisse del pannello
// allora le ricavo con la maniera base
Dimension dimPanel = getSize();
}
}

soluzione 2 CON LayoutManager

class MasterFrame extends JFrame
{
// Riferimento globale al pannello di gioco
PanelGame pnlGame = null;

public MasterFrame()
{
super();

// Disabilito il LayoutManager, ma a questo punto se
// Sei tu che devi gestire uno ad uno tutti i componenti ad esso
// aggiunti.
getContentPane().setLayout(new BorderLayout());

// Creo l'istanza del pannello di gioco
pnlGame = new PanelGame(....parametri....);

// Aggiungo il pannello di gioco al frame.
getContentPane().add(pnlGame);
}

// Questo metodo nel caso di LayoutManage non serve
// perchè la dimensione del pannello è auto-gestita dal LayoutManage
// al variare del Frame Principale
// In essa però puoi vedere come si settano le preferred size
private void setDimensionePannelloDiGioco(int w, int h)
{
// setto le dimensioni preferite al fine di far si che
// il LayoutManager ne tenga conto
pnlGame.setPreferredSize(new Dimension(w,h));
}
}

class PanelGame extends JPanel
{
protected void paintComponent(Graphics g)
{
super.paintComponent(g);

// Visto che le dimensioni sono autogestite dal LayoutManager
// posso ricavarmele mediante le dimensione di preferenza
Dimension dimPanel = getPreferredSize();
}
}

Se la mia ipotesi è giusta, cioè il problema è che stai utilizzando i layoutManager, allora ti consiglio di dare uno sguardo ai tutorial sun per capirli meglio.

Ciao e spero di esseri stato d'aiuto.
TellaspallaBob è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 19:34   #19
fefott
Junior Member
 
L'Avatar di fefott
 
Iscritto dal: Jul 2005
Messaggi: 20
Ho provato tutta la sera le tue soluzioni ma, purtroppo il risultato è sempre lo stesso...striscita nera laterale...poi ho provato a mettere setResizable(true); e giocando a ridimensionare a mano mi sono accorta che una volta che rimpicciolisco e poi ingrandisco il labirinto miracolosamente lui compare per intero...ma di certo questa non è una buona soluzione...
fefott è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2006, 20:12   #20
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Mi è venuto un dubbio, ma il repaint() del jpanel dove disegni, ogni quanto lo chiami? Non è che per caso lo chiami solo una volta?
MEMon è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Oracle NetSuite si potenzia con nuove fu...
Musica generata con l'IA: Sony lavora a ...
Cyberpunk 2077 in versione PC su smartph...
BYD si gioca un grosso jolly: pronta Rac...
Samsung annuncia l'arrivo in Italia dei ...
Offerta lancio Pixel 10a: come ottenere ...
Google presenta Pixel 10a: poche le novi...
Caos F1 2026: 14 monoposto senza omologa...
Tesla festeggia il primo Cybercab prodot...
Desktop piccolo e potente? NZXT H2 Flow ...
Polestar spinge sull'acceleratore: arriv...
Nuovo record mondiale nel fotovoltaico: ...
L'ultimo baluardo cade: fine supporto pe...
'Il mondo non ha mai visto nulla di simi...
La Commissione europea mette sotto indag...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v