2015-08-05 3 views
0

Je ne comprends pas. Je veux ajouter Highlight extends JComponent objets à un PdfPage extends JPanel mais les composants Highlight sont simples non peints. Je peux voir que leurs méthodes paint() et paintComponent() sont appelées dans l'ordre correct mais elles n'apparaissent pas. La seule chose qui résout mon problème est d'ajouter:Peinture multiple JComponent sur JPanel ne fonctionne pas

for(Component component : this.getComponents()) {   
    component.paint(g);   
} 

dans la méthode PdfPanel.paint(), mais ce n'est pas ce que je veux faire. Je veux PdfPage extends JPanel pour rendre n'importe quel JComponent J'ajoute mais ne remplace pas paint() si possible.

Voici comment ajouter Highlight composants PdfPage panneaux:

for (DatasheetError datasheetError : datasheetErrorList) { 

    int pageNumber = datasheetError.getPageNumber(); 
    Highlight highlight = createErrorHighlight(datasheetError); 

    PdfPage pdfPage = pdfPages[pageNumber];  
    pdfPage.add(highlight); 
} 

Voici comment PdfPage ressemble. Remarque que je ne suis pas en utilisant un LayoutManager que j'appelle super(null);:

public class PdfPage extends JPanel { 
    private static final long serialVersionUID = 7756137054877582063L; 

    final Image pageImage; 

    public PdfPage(Image pageImage) { 
     // No need for a 'LayoutManager' 
     super(null); 

     this.pageImage = pageImage;  
     Rectangle bounds = new Rectangle(0, 0, pageImage.getWidth(null), pageImage.getHeight(null)); 
     this.setBounds(bounds); 
     this.setLayout(null); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     paintPdfPage(g); 
    } 

    private void paintPdfPage(Graphics g) { 
     // For now transparent background to see if `Highlight` gets painted 
     g.setColor(new Color(1.0f, 1.0f, 1.0f, 0.0f)); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

} 

En Highlight.java vous pouvez voir que j'appelle this.setBounds(bounds);

public class Highlight extends JComponent { 
    private static final long serialVersionUID = -1010170342883487727L; 

    private Color borderColor = new Color(0, 0, 0, 0); 

    private Color fillColor; 

    public Highlight(Rectangle bounds, Color fillColor) { 
     this.fillColor = fillColor; 
     this.setBounds(bounds); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     Rectangle bounds = this.getBounds(); 

     g.setColor(this.fillColor); 
     g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); 

     g.setColor(this.borderColor); 
     g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);  
    } 
} 
+2

1. appelez directement à la variable par ex. myComponent.repaint() au lieu de boucles component.paint (g); 2. Surimprimez getPreferredSize au lieu de Rectangle bounds = this.getBounds(); puis utilisez getWeight/Height rahter que bounds.width, bounds.height, 3. pour une meilleure aide plus tôt après un SSCCE/MCVE, court runnable, compilable – mKorbel

+0

@mKorbel 1. Comme je l'ai dit dans ma question, je ne veux pas avoir cette boucle dans 'paint()'. Imho Je ne devrais pas avoir à appeler 'paint()' ou 'repaint()' sur tout 'JComponent' que j'ai ajouté. 2. Pourquoi? Je suis juste en train de tirer les limites pour dessiner un simple rectangle? Pourquoi devrais-je remplacer 'getPreferredSize()'? Il renvoie déjà les valeurs correctes. 3. D'accord, je verrai ce que je peux faire. – displayname

+0

1. Appelez myVariableName.repaint(), 2. getPreferredSize() retourne par défaut les coordonnées correctes, est implémenté dans les API JComponent et LayoutManagers, pourquoi les boucles multiples sont là de manière directe 3. Je vais voir ce que je peux faire. == à vous, peut-être que ce sera une bonne question – mKorbel

Répondre

1

Ressemble problème est un espace de coordonnées

protected void paintComponent(Graphics g) { 
... 
     Rectangle bounds = this.getBounds(); 

     g.setColor(this.fillColor); 
     g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); 
... 
    } 

La propriété getBounds() renvoie e rectanle du composant sur le conteneur parent. Donc, quand vous pouvez appeler juste g.fillRect(0, 0, bounds.width, bounds.height);

+0

Goddammit tu as raison! Donc, le rectangle vient d'être placé hors-écran tout le temps! Merci, merci, merci ça me rendait fou! – displayname