Repaint problema con JPanel all'interno di un altro JPanel
Domanda
sto disegnando forme all'interno di questa JPanel
, che è anche all'interno di un altro JPanel
principale. A repaint()
attira solo le forme per un millesimo di secondo e poi scompaiono. Essi non rimangono dipinte, perché?
Il mio metodo paintComponent
è qualcosa di simile
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < reportElements.size(); i++) {
this.reportElements.get(i).display((Graphics2D) pageComponents.get(i).getGraphics());
}
}
Quando il genitore è un JEditorPane
con setEditable()
attivato, funziona e possiamo vedere le forme, ma quando si tratta di un JPanel
, dopo un millisecondo tutto quello che vedo è pannelli vuoti.
Soluzione
In questo caso cosa accade a coloro pageComponents, i piccoli JPanels? Il pannello padre non è gonna disegnare la forme su di loro è?
Non sono sicuro che mi undertand il tuo commento. Il tuo pannello principale dovrebbe contenere pannelli bambino. I pannelli bambino dovrebbero essere aggiunti al pannello principale utilizzando un gestore di layout. Poi, quando swing decide di ridipingere il pannello principale, sarà anche ridisegnare tutti i pannelli del bambino e, a sua volta i pannelli bambino ridipingere là forme.
Per quanto il suo valore Custom Painting Approcci ha un esempio di lavoro di disegnare forme su un pannello.
Altri suggerimenti
si dovrebbe dipingere l'oggetto Graphics del JPanel per essere permanente ... Nel tuo esempio, che è il Graphics g
...
ultrajohn è morto. È necessario utilizzare il Graphics
v'è stato superato. Continua a leggere per il perché ...
Java 1.6 ha introdotto il RepaintManager
che supporta l'ottimizzazione delle richieste di ridisegnare. Ha alcune sottili effetti sulla pittura.
In questo caso, si sta lavorando con più oggetti Graphics2D: il g
passò in paintComponent
e il valore restituito dalla chiamata getGraphics
Il gestore ridisegno ha consegnato si g
su cui dipingere. Nota:. Questo non dipinge sullo schermo, ma su un buffer temporaneo (assumendo che il doppio buffer di default)
Nel paintComponent
chiami si sta disegnando per la grafica ottenuti getGraphics
dei vari componenti. Questo è bypassando il manager ridipingere e la pittura direttamente al display unbuffered.
Quando ritorna paintChildren
, il RepaintManager
calci per gestire l'aggiornamento del doppio buffer. Dipinge il buffer temporaneo in bianco sopra il buffer visualizzato, in modo efficace cancellando ciò che è stato dipinto attraverso l'oggetto Graphics ottenuto dalla getGraphics
Potrebbe essere che paintChildren
o paintBorder
amplifica tutto ciò che hai disegnato nel metodo. Forse provare ignorando paint
invece. Ci avete il pieno controllo su ciò che verrà dipinta sul componente, e si può decidere da soli se chiamare ulteriormente paintComponent
, paintChildren
o paintBorder
a tutti.