2015-08-05 4 views
0

Я просто этого не понимаю. Я хочу добавить 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);  
    } 
} 
+2

1. позвонить непосредственно к переменной, например. myComponent.repaint() вместо циклов component.paint (g); 2. переопределите getPreferredSize вместо Rectangle bounds = this.getBounds() ;, затем используйте getWeight/Height rahter, чем bounds.width, bounds.height, 3. для лучшей помощи скорее опубликуйте SSCCE/MCVE, короткий runnable, компилируемый – mKorbel

+0

@mKorbel 1. Как я уже сказал в своем вопросе, я не хочу иметь этот цикл в 'paint()'. Imho Мне не нужно было бы называть 'paint()' или 'repaint()' на любом добавленном JComponent'I. 2. Почему? Я просто получаю границы, чтобы просто нарисовать простой прямоугольник? Почему я должен переопределять 'getPreferredSize()'? Он уже возвращает правильные значения. 3. Согласитесь, я посмотрю, что я могу сделать. – displayname

+0

1. вызовите myVariableName.repaint(), 2. getPreferredSize() возвращает по умолчанию правильные координаты, реализован в API JComponent и LayoutManagers, почему несколько циклов, если есть прямой путь 3. Я посмотрю, что я могу сделать. == до вас, может быть, это будет хороший вопрос. – mKorbel

ответ

1

Похоже, проблема заключается в координатном пространстве

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

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

GetBounds() возвращает th e rectanle на родительском контейнере. Поэтому, когда вы можете позвонить только g.fillRect(0, 0, bounds.width, bounds.height);

+0

Черт возьми, вы правы! Таким образом, прямоугольник только что был помещен за пределы экрана все время! Спасибо, благодарю вас, спасибо, что это сводило меня с ума! – displayname