首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >打印时,JPanel的内容仅显示在页面顶部

打印时,JPanel的内容仅显示在页面顶部
EN

Stack Overflow用户
提问于 2019-06-18 19:16:27
回答 1查看 131关注 0票数 0

完整的代码可以在github上找到。打印部分位于src/main/java/antafes/vampireEditor/gui/BaseWindow.java下,页面对象可以在src/main/java/antafes/vampireEditor/print/中找到。

对我来说另一件奇怪的事情是,lambda函数中的部分被调用了大约10次…这正常吗?

如果您需要进一步的信息,请让我知道。

如果我使用一个字符已经显示的打印预览元素,至少对于当前选择的页面(这三行被注释掉了),我已经设法让它工作了。

代码语言:javascript
复制
if (!this.isAnyCharacterLoaded()) {
    return;
}

PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setJobName(this.language.translate("printCharacter"));
printerJob.setPrintable ((graphics, pageFormat, pageNum) -> {
    if (pageNum > 0){
        return Printable.NO_SUCH_PAGE;
    }

    Graphics2D graphics2D = (Graphics2D) graphics;
    graphics2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    //CharacterTabbedPane pane = (CharacterTabbedPane) charactersTabPane.getSelectedComponent();
    //PrintPreviewPanel printPreview = pane.getPrintPreview();
    //printPreview.printContent(graphics2D);
    PrintBase page;

    switch (pageNum) {
        case 0:
        default:
            page = new General(this.getActiveCharacter(), false);
            break;
    }

    Dimension dimension = new Dimension((int) pageFormat.getWidth(), (int) pageFormat.getHeight());
    page.setSize(dimension);
    page.create();
    page.paint(graphics2D);

    return Printable.PAGE_EXISTS;
});

if (!printerJob.printDialog()) {
    return;
}

try {
    printerJob.print();
} catch (PrinterException ex) {
    // handle exception
}

页面上的内容应像打印预览中那样显示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-27 04:13:39

问题是,组件布局不正确。@second给我指明了正确的方向。按照他的建议,我研究了一下ScreenImage类。使用这个类创建图像是可行的,因此我开始使用ScreenImage类实现打印过程。

经过一段时间和对这个过程的一些思考之后,我发现我只需要这个类中的一个方法。我采用了layoutComponent()方法,并且只使用了它。在使用中,元素被正确布局,现在以我想要的方式显示出来。

代码语言:javascript
复制
private void layoutComponent(Component component)
{
    synchronized (component.getTreeLock())
    {
        component.doLayout();

        if (component instanceof Container)
        {
            for (Component child : ((Container)component).getComponents())
            {
                this.layoutComponent(child);
            }
        }
    }
}

稍后对论文进行一些调整,一切看起来都应该是这样的:)

再次感谢@second为我指明了正确的方向。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56647884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档