gpt4 book ai didi

java - SWT UI 线程没有响应 - 打印错误

转载 作者:行者123 更新时间:2023-11-30 11:39:20 24 4
gpt4 key购买 nike

enter image description here

我的 SWT TitleAreaDialog 中有一个打印按钮。

viewPDFButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
try {

startPdfPrintOperation();
}
catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

我从表中的用户选择中获取现有的 PDF 文件名和路径。然后我想要将 pdf 文件打印到本地打印机。需要允许用户选择所选的本地打印机。

public void startPdfPrintOperation() throws Exception {
File file = new File(getPDFFileName());
RandomAccessFile raf;
raf = new RandomAccessFile(file, "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
pdfFile = new PDFFile(buf);
PDFPrintPage pages = new PDFPrintPage(pdfFile);

// Create Print Job
pjob = PrinterJob.getPrinterJob();
pjob.setPrintable(new MyPrintable());
final HashPrintRequestAttributeSet attset;
attset = new HashPrintRequestAttributeSet ();
attset.add (new PageRanges (1, pdfFile.getNumPages ()));
if (pjob.printDialog (attset)) {
try {
pjob.print (attset);
}
catch (PrinterException e) {
e.printStackTrace();
}
}
}
class MyPrintable implements Printable {
public int print (Graphics g, PageFormat format, int index) throws PrinterException {
int pagenum = index+1;
if (pagenum < 1 || pagenum > pdfFile.getNumPages ())
return NO_SUCH_PAGE;

Graphics2D g2d = (Graphics2D) g;
AffineTransform at = g2d.getTransform ();
PDFPage pdfPage = pdfFile.getPage (pagenum);

Dimension dim;
dim = pdfPage.getUnstretchedSize ((int) format.getImageableWidth (),
(int) format.getImageableHeight (),
pdfPage.getBBox ());

Rectangle bounds = new Rectangle ((int) format.getImageableX (),
(int) format.getImageableY (),
dim.width,
dim.height);

PDFRenderer rend = new PDFRenderer (pdfPage, (Graphics2D) g, bounds, null, null);

try
{
pdfPage.waitForFinish ();
rend.run ();
}
catch (InterruptedException ie)
{
MessageDialog.openError(null, "PDF Error Message", "Needs");
}
g2d.setTransform (at);
g2d.draw (new Rectangle2D.Double (format.getImageableX (),
format.getImageableY (),
format.getImageableWidth (),
format.getImageableHeight ()));
return PAGE_EXISTS;
}
}

我从第 315 行收到上述错误

if (pjob.printDialog (attset)) {

打印机对话框打开,整个应用程序被卡住并且没有响应。然后在大约 30 秒后,我得到了上述错误。

我尝试在多个位置使用 Display.getDefault().asyncExec(new Runnable() ) 但这没有帮助。

会不会是因为base dialog是SWT而打印机dialog是AWT?

最佳答案

由于您没有定义“在多个位置”,我建议您在其自己的类中重构打印作业,扩展 Thread 并在 run< 中实现启动打印作业 方法。
我不熟悉上面代码中的所有类,你可以尝试简单地启动这个线程,它会与 SWT 线程并行运行。尝试避免共享资源,这可能有助于解决您的僵局。如果你想从这个线程得到一个 UI 响应,你可以换行,例如调用 Display.getDefault().asyncExec(new Runnable() { ... }.
时的 SWT 消息框(“打印完成!”)此外,请测试没有UI代码的打印代码是否产生相同的异常。如果是这样,则环境可能配置错误。

关于java - SWT UI 线程没有响应 - 打印错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13316743/

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