Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么绘图(图形g)没有从子JComponent调用?_Java_Swing_Paint_Java 2d - Fatal编程技术网

Java 为什么绘图(图形g)没有从子JComponent调用?

Java 为什么绘图(图形g)没有从子JComponent调用?,java,swing,paint,java-2d,Java,Swing,Paint,Java 2d,我有一个简单的JComponent,它的功能是PdfPage,但基本上只是一个渲染的图像 但是,此PdfPage应包含突出显示注释,例如用于标记PDF文档中的错误 Highlight只是另一个将自身绘制为矩形的JComponent: public class Highlight extends JComponent { private Rectangle rectangle; private Color borderColor = new Color(0, 0, 0, 0);

我有一个简单的
JComponent
,它的功能是
PdfPage
,但基本上只是一个渲染的
图像

但是,此
PdfPage
应包含
突出显示
注释,例如用于标记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
添加
高亮显示
不会导致绘制:

    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
对象上有一个循环,并在每个
PdfPage
内部调用
paint(Graphics g)
,如下所示:

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()
,但没有成功


为什么没有从每个突出显示的
调用
pain(Graphics g)
方法?我能以某种方式执行吗?

您不应该直接绘制组件,这是Swing的工作。摆脱试图从PdfPage类中绘制高光的代码

将组件添加到容器时,子组件将通过
paintChildren(…)
方法进行绘制。有关更多信息,请阅读上的Swing教程部分

如注释中所述,自定义绘制是在
paintComponent()
方法中完成的。在您的例子中,您重写了paint(),但不调用super.paint(),因此永远不会调用paintChildren()方法,从而不会绘制子组件

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

因此,修复代码,让正常的Swing绘制机制工作,而不是自己尝试


或者,如果您想进行自定义绘制,另一种方法是使用
addHighlight(…)
作为
PdfPage
类的方法。然后在本例中,您将保留一个要绘制的矩形列表,并在PdfPage类的
paintComponent()
方法中遍历该列表。查看中的
DrawOnComponent
示例以了解此方法的工作示例。

对于
JComponent
您应该覆盖
paintComponent
方法,而不是
Painting
方法。还有一件事。。由于PDF页面实际上只是一个
图像
,我应该在哪里绘制它?由于这不是一个组件,而是代表实际页面,因此可以使用
paint(Graphics g)
来绘制
图像
paintComponent()
来绘制高光吗?@StefanFalk,您可以使用ImageIcon在JLabel中显示图像。然后,您只需像其他组件一样将标签添加到GUI中。查看我提供的教程链接的目录。还有一节介绍如何使用标签。