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);
}
}
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
@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
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