我就是不明白这一点。我想向中添加Highlight extends JComponent
对象,PdfPage extends JPanel
但Highlight
组件很简单,没有绘制。我可以看到它们的paint()
和paintComponent()
方法以正确的顺序被调用,但是它们没有显示出来。解决我的问题的唯一方法是添加:
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
样子。请注意,我没有使用a,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);
}
}
看起来问题是坐标空间
protected void paintComponent(Graphics g) {
...
Rectangle bounds = this.getBounds();
g.setColor(this.fillColor);
g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
...
}
getBounds()返回父容器上组件的Rectanle 。所以当你可以打电话给g.fillRect(0, 0, bounds.width, bounds.height);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句