Java在EDT之外在自己的线程中绘制图形?

问题描述 投票:0回答:1

我正在编写Swing应用程序,它使用Apache PDFBox在paintComponent方法中将PDF页面绘制到JPanel的Graphics2D对象。绘图需要一段时间,因此当我的应用程序需要同时显示许多PDF页面时,它会变得很慢且很慢。我知道,由于我绘制PDF页面的JPanel是GUI的一部分,因此需要在事件分发线程中进行绘制。但是,绝对不可能在自己的线程中绘制每个JPanel吗?像使用SwingWorker一样?

示例代码(简体):

public class PDFPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);

        Graphics2D g2 = (Graphics2D) graphics;
        int scale = 1;   // (simplified this line)

        g2.setColor(getBackground());
        g2.fillRect(0, 0, getWidth(), getHeight());

        try {
            pdfRenderer.renderPageToGraphics(pageNumber, g2, (float) scale, (float) scale);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
java multithreading swing paintcomponent event-dispatch-thread
1个回答
0
投票

使用BufferedImage图像字段。它有一种可以借鉴的方法createGraphics()。然后调用Graphics.dispose()清理资源。

然后在paintComponent中检查图像的可用性,以显示它。

渲染可以在Future,SwingWorker或其他工具中完成。没错,绝对不要在paintComponent中执行繁重的操作,尤其是可能会反复调用它。

最好在构造函数或您的控制器中启动渲染。

    BufferedImage image = new BufferedImage(getWidth(), getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = image.createGraphics();
    try {
        pdfRenderer.renderPageToGraphics(pageNumber, g2, (float) scale, (float) scale);
    } finally {
        g2d.dispose();
    }

最初没有填充宽度和高度,因此最好使用PDF中的宽度和高度。同样不是说Graphics2D允许缩放。您可以轻松添加缩放。

如何自动处理通过渲染图像的方法可能很清楚。

© www.soinside.com 2019 - 2024. All rights reserved.