Я просто этого не понимаю. Я хочу добавить Highlight extends JComponent
объектов в PdfPage extends JPanel
, но компоненты Highlight
просты, не окрашены. Я вижу, что их методыи paintComponent()
вызываются в правильном порядке, но они не отображаются. Единственное, что фиксирует мою проблему, чтобы добавить:Картина нескольких JComponent на JPanel не работает
for(Component component : this.getComponents()) {
component.paint(g);
}
в метод PdfPanel.paint()
, но это не так, как я хочу, чтобы сделать это. Я хочу PdfPage extends JPanel
для рендеринга JComponent
Я добавляю, но не переопределяю paint()
, если это возможно.
Это, как я добавить Highlight
компоненты PdfPage
панелей:
for (DatasheetError datasheetError : datasheetErrorList) {
int pageNumber = datasheetError.getPageNumber();
Highlight highlight = createErrorHighlight(datasheetError);
PdfPage pdfPage = pdfPages[pageNumber];
pdfPage.add(highlight);
}
Это как PdfPage
выглядит. Примечание что я не использую LayoutManager
, как я называю 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());
}
}
В Highlight.java вы можете увидеть, что я называю 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. позвонить непосредственно к переменной, например. myComponent.repaint() вместо циклов component.paint (g); 2. переопределите getPreferredSize вместо Rectangle bounds = this.getBounds() ;, затем используйте getWeight/Height rahter, чем bounds.width, bounds.height, 3. для лучшей помощи скорее опубликуйте SSCCE/MCVE, короткий runnable, компилируемый – mKorbel
@mKorbel 1. Как я уже сказал в своем вопросе, я не хочу иметь этот цикл в 'paint()'. Imho Мне не нужно было бы называть 'paint()' или 'repaint()' на любом добавленном JComponent'I. 2. Почему? Я просто получаю границы, чтобы просто нарисовать простой прямоугольник? Почему я должен переопределять 'getPreferredSize()'? Он уже возвращает правильные значения. 3. Согласитесь, я посмотрю, что я могу сделать. – displayname
1. вызовите myVariableName.repaint(), 2. getPreferredSize() возвращает по умолчанию правильные координаты, реализован в API JComponent и LayoutManagers, почему несколько циклов, если есть прямой путь 3. Я посмотрю, что я могу сделать. == до вас, может быть, это будет хороший вопрос. – mKorbel