PDA

View Full Version : [Java-Swing]Piccolo problema nel disegno di un rettangolo


Player1
27-08-2008, 17:30
Ok vorrei fare un programma un pò più complesso di quello che disegna un rettangolo ma per me il traguardo è riuscire a disegnare il rettangolo visto che poi tutte le funzionalità aggiuntive sono semplice codice aggiunto (almeno spero).
Ho un pò di nozioni di Java swing ed ho anche visto alcuni esempietti ma a me questo rettangolo proprio non vuole uscire, molto probabilmente perchè il jpanel nel quale vorrei disegnarlo si trova all'interno di altri componenti e la struttura (disegnata con NetBeans) è un bel pò più complessa rispetto alla semplicissima struttura con 3 classi per disegnare un frame con al centro un rettangolo mostrata negli esempi.

Bene passiamo al mio programma:
Ho come dicevo prima una struttura un pò complessa ma credo si possa tranquillamente trascurarla e concentrarsi sul pannello nel quale desidero visualizzare il disegno.
Esso è un Jpanel chiamato "pannelloDisegno".
Mettendo un mouseListener sempre mediante NetBeans a questo jpanel ho inserito il seguente codice:

private void pannelloDisegnoMousePressed(java.awt.event.MouseEvent evt) {
pannelloDisegno.setVisible(true);
Graphics g=pannelloDisegno.getGraphics();
g.setColor(Color.RED);
g.drawRect(1,1,10,10);
System.out.print("DEBUGok!!!");

pannelloDisegno.paint(g);
}

Bene, cliccando sul pannello ricevo sulla console la scritta "DEBUGok!!!" segno che il mouselistener funziona e che il codice che ho scritto sopra viene eseguito (e tra l'altro non lancia eccezioni di nessun tipo), ma purtroppo il pannello rimane grigio, non cambia assolutamente nulla.

Sapete dirmi dove si trova l'errore?
Grazie! :)

wizard1993
27-08-2008, 17:57
ora sono un po' arrugginito, ma il componenete non dovresti aggiungerlo a al pannello?

vincenzo83
27-08-2008, 18:55
...mmmh forse le istruzioni per disegnare un rettangolo devono essere inserite nel metodo painComponent(...)

oppure devi fare un repaint() sul pannello...

banryu79
28-08-2008, 08:21
...mmmh forse le istruzioni per disegnare un rettangolo devono essere inserite nel metodo painComponent(...)

oppure devi fare un repaint() sul pannello...

Esatto: il problema è questo.
Infatti nel codice da te postato si vede che vai a manipolare l'oggetto Graphics facendotelo restituire dal JPanel.
Non si dovrebbe mai manipolare l'oggetto Graphics facendoselo restituire dal componente su cui si vuole disegnare all'esterno dei metodi canonici previsti da AWT e Swing (paint(Graphics g) & paintComponent(Graphics g))

Se vuoi approfondire la questione consulta questo articolo (http://java.sun.com/products/jfc/tsc/articles/painting/).