gpt4 book ai didi

java - 为什么子 JComponent 没有调用 Paint(Graphics g)?

转载 作者:行者123 更新时间:2023-12-02 04:29:07 25 4
gpt4 key购买 nike

我有一个简单的 JComponent,其功能相当于 PdfPage,但基本上只是一个渲染的 Image

但是,此 PdfPage 应该包含 Highlight 注释,例如在 PDF 文档中标记错误。

Highlight 只是另一个 JComponent,它只是将自身绘制为矩形:

public class Highlight extends JComponent {

private Rectangle rectangle;
private Color borderColor = new Color(0, 0, 0, 0);
private Color fillColor;

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

@Override
public void paint(Graphics g) {

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

g.setColor(this.borderColor);
g.drawRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
}
}

问题是向 PdfPage 添加 Highlight 不会导致其被绘制:

    for (DatasheetError datasheetError : datasheetErrorList) {

Highlight highlight = createErrorHighlight(datasheetError);

int pageNumber = datasheetError.getPage() - 1;
PdfPage pdfPage = pdfPages[pageNumber];
pdfPage.add(highlight);
pdfPage.repaint() // Does not help here!
pdfPage.invalidate(); // Does not help here!
}

这就是为什么我对 PdfPage 的所有子 Component 对象进行循环,并在每个内部调用 paint(Graphics g) PdfPage 如下所示:

public class PdfPage extends JComponent {

// ...

@Override
public void paint(Graphics g) {

// Paint the pdf page ..
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
if (pageImage != null) {
int x = 0, y = 0, width = pageImage.getWidth(null), height = pageImage.getHeight(null);
g.drawImage(pageImage, x, y, width, height, null);
}

// Paint all child components such as "Highlight"
for(Component component : this.getComponents()) {
component.paint(g);
}
}
}

这是我应该这样做的方式还是有更好的方法来绘制该 PdfPage 的子组件?我尝试在每个 PdfPage 上调用 repaint()invalidate() 但没有成功。

为什么每个 Highlight 不调用 pain(Graphics g) 方法?我可以以某种方式执行它吗?

最佳答案

您不应该直接绘制组件,这是 Swing 的工作。删除尝试从 PdfPage 类中绘制突出显示的代码。

当您向容器添加组件时,子组件将由 paintChildren(...) 方法绘制。阅读 Swing 教程中关于 A Closer Look at the Paint Mechanism 的部分了解更多信息。

正如评论中提到的,自定义绘制是在 paintComponent() 方法中完成的。在您的情况下,您重写paint()但不调用super.paint(),因此永远不会调用paintChildren()方法,因此子组件不会被绘制。

但是,当您修复此问题时,JComponent 不使用布局管理器,因此当您将组件添加到 PdfPage 类时,它们将不会被绘制。因此,您需要指定组件的大小和位置。在您的情况下,看起来大小/位置将基于矩形。

因此请修复代码并让正常的 Swing 绘画机制发挥作用,而不是尝试自己完成。

或者,如果您想要进行自定义绘画,则另一种方法是使用 addHighlight(...) 作为 PdfPage 类的方法。然后,在这种情况下,您将保留要绘制的矩形列表,并在 PdfPage 类的 paintComponent() 方法中迭代此列表。查看 Custom Painting Approaches 中的 DrawOnComponent 示例有关此方法的工作示例。

关于java - 为什么子 JComponent 没有调用 Paint(Graphics g)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com