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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top