在将多个对象添加到JPanel

时间:2015-08-04 15:32:25

标签: java swing

事实证明是我在错误的坐标系中思考。它总是按预期工作,但我基本上是在屏幕外绘制矩形。 See my other stackoverflow question

注意:我要求删除此问题,但主持人决定留下这个问题。

我有PdfPage extends JPanel表示PDF页面,其被绘制为Image。首先,我加载图像(使用PDFBox渲染)并将其添加到我编写的简单分页器中。然后,我使用Highlight向每个PdfPage添加PdfPage.add(JComponent component)个对象,其中每个Highlight都应该在我的文档中注释错误。

我的问题是,只有最后添加的Highlight被绘制而其他人不可见..

public DatasheetReviserRenderer(File file, List<DatasheetError> datasheetErrorList, int resolution) {

    // ..
    this.pdfViewer = new PdfViewer(file, resolution);

    PdfPage[] pdfPages = this.pdfViewer.getPdfPages();

    List<Highlight> highlights = new ArrayList<Highlight>();

    for (DatasheetError datasheetError : datasheetErrorList) {

        int pageNumber = datasheetError.getPage();
        Highlight highlight = createErrorHighlight(datasheetError);
        highlights.add(highlight);

        PdfPage pdfPage = pdfPages[pageNumber];         
        pdfPage.add(highlight); 
    }

    this.pdfViewer.setVisible(true);
}

private Highlight createErrorHighlight(DatasheetError datasheetError) {
    // ..
    return new Highlight(rectangle, new Color(0.5f, 0.1f,0.3f, 0.4f));
}

这是 PdfPage.java 的样子:

public class PdfPage extends JPanel {
    private static final long serialVersionUID = 7756137054877582063L;

    final Image pageImage;

    public PdfPage(Image pageImage) {
        super(new BorderLayout());
        // ..
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintPdfPage(g);
    }

    private void paintPdfPage(Graphics g) {
        // just draws pageImage
    }
}

这是 Highlight.java

public class Highlight extends JComponent {
    private static final long serialVersionUID = -5376556610591196188L;

    /** The rectangle that represents the highlight. */
    private Rectangle rectangle;

    /** Border is invisible per default. */
    private Color borderColor = new Color(0, 0, 0, 0);

    /** The highlight color. */
    private Color fillColor;

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

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

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

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

}

为什么没有绘制所有Highlight个对象?

1 个答案:

答案 0 :(得分:1)

罪魁祸首是:

grails run-app -Dgrails.env=myenv

每次向super(new BorderLayout()); 添加组件时,它都会替换中心中的组件,弃用之前添加的组件。

如果你把它保留为:

PdfPage

它适用于super(); ,您可以在其中拥有任意数量的组件。但是,FlowLayout组件的大小为0x0(因为您永远不会给它们一个大小),因此您绘制的任何内容也都不可见。

有两种方法:

  1. 评论时,将Highlight设为POJO,然后直接从Highlight绘制。
  2. 使用PdfPage.paint()布局和give your components hard-coded dimensions and bounds(虽然不是一个干净的解决方案)。