PDA

Visualizza la versione completa : [JAVA] Disegno con la classe Graphics in un JFrame


royalsalerno
07-09-2005, 15:56
Ho un problema con la classe Graphics: ho un JFrame in cui dovrei disegnare un cerchio, ma quando lo disegna, si vede solo per un attimo e poi scompare!
In pratica il programma funziona così: cliccando e trascinando il mouse, l'utente definisce posizione e dimensione del cerchio che, una volta rilasciato il mouse, dovrebbe apparire, ma, come suddetto, l'immagine appare solo per un attimo e poi scompare...
Per favore, aiutatemi!!!
Grazie, ciao

Andrea1979
07-09-2005, 16:23
no codice, no help. :ciauz: :yuppi:

LeleFT
07-09-2005, 18:25
Voglio tentare di indovinare: hai ridefinito il metodo paint()! :)

Se così è, prova a ridefinire il metodo paintComponent() al posto di paint().

(Mi sa che qui mi vogliono copiare la lavagna... un progetto che ho realizzato per l'esame di OOP all'università... :master: )


Ciao. :ciauz:

royalsalerno
07-09-2005, 20:12
Il codice è molto complesso, credo sia complicato cercare di studiarlo... Il fatto è che ho provato anche con qualcosa di più semplice e mi dà lo stesso problema, vi posto questo codice:
public class Prova
{
...
public Prova extends JFrame implements ActionListener
{
...
JComboBox j=new JComboBox();
j.addActionListener(this);
...
}

public void actionPerformed(ActionEvent e)
{
JFrame f=new JFrame("prova");
f.setSize(200,200);
f.setVisible(true);
Graphics g=f.getGraphics();
g.drawRect(10,10,100,100);
}
...
}

Il rettangolo nel JFrame "prova" appare solo per un attimo e poi scompare... Provando a spostare un pò di righe, a volte sono riuscito a far comparire il rettangolo, ma se ridimensiono la finestra, scompare!

P.S.
Preciso che mi dà lo stesso problema anche scrivendo g=f.getContentPane().getGraphics();

P.P.S.
Non ho toccato il metodo paint().

royalsalerno
08-09-2005, 20:11
Nessuno ha idea di come potrei fare?
Facendo un pò di prove, ho visto che se faccio il disegno (con la classe Graphics) in una Label (non JLabel perchè mi dà lo stesso problema!) il disegno compare correttamente e non scompare!
Ho pensato che potrei risolvere così, mettando la Label col disegno nel JFrame, però mi si presenta un altro problema: come posso rendere la Label con lo sfondo trasparente?
In pratica esiste per la classe Label un metodo analogo a SetOpaque della JLabel?

royalsalerno
10-09-2005, 19:36
Aggiornamento sul mio "dramma" (è per la tesi e non riesco ad andare avanti!!!!!!!).
L'utilizzo della classe mi dà troppi altri problemi, per cui ho deciso di usare una JLabel contenente il disegno.
Il problema è sempre lo stesso: il rettangolo appare solo per un attimo e poi scompare.
Posto un esempio di codice:
public class Prova implements ActionListener
{
public static void main (String args[])
{
Prova p=new Prova();
}
public Prova()
{
JFrame d=new JFrame("p");
d.setSize(200,200);
Container c=d.getContentPane();
c.setLayout();
JButton b=new JButton("apri");
b.setBounds(50,50,100,30);
c.add(b);
b.addActionListener(this);
d.setVisible(true);
}
public actionPerformed(ActionEvent e)
{
JFrame jf=new JFrame("ecco");
JLabel jl=new JLabel();
jf.setSize(150,150);
jf.getContentPane().setLayout(null);
jl.setBounds(10,10,100,100);
Graphics gr=jl.getGraphics();
gr.fillRect(10,10,70,50);
}
}
Nessuno ha qualche idea?
Qualcuno può dirmi se provando con questo codice ha il mio stesso problema?
Per favore, aiutatemi!!!!

anx721
10-09-2005, 21:51
Il disegno scompare perchè dopo che l'hai disegnato il metodo painComponent viene richiamato cancellandolo. paintComponent è il metodo che si occupa di disegnare ilcomponente ogni volta che ce n'è bisogno. E' ridfinendo tale metodo che ottieni un disegno persistente. Nel tuo metodo actionPerformed non devi effettuare il disegno, devi solo impostarti delle variabili in base alle quali effettuare il disegno. Ad esempio tale metodo si puo occupare di mettere a true un campo booleano. Il metodo paintComponent legge tale booleano; se vale true effettua il disegno. Inoltre devi impostare diversamente le cose. Devi creare una tua classe che estende JFrame a cui sarà aggiunto il tuo pannello col disegno. Questo deve esere istanza di una classe che estende JPanel e in cui ridefinisci il metodo paintComponent (che riceve l'oggetto Graphics del pannello come parametro).

royalsalerno
14-09-2005, 12:23
Grazie Grazie Grazie!!!!!!
Ho riscritto il metodo paintComponent ed è tutto ok!
Grazie ancora!

Loading