gpt4 book ai didi

java - 在应用程序运行时用 Java 刷新打印机

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:28:49 25 4
gpt4 key购买 nike

正如标题所说,我想在我的 Java 应用程序运行时刷新计算机设置中注册的打印机。通常,我可以使用 PrinterJob.lookupPrintServices() 获取打印机。但是,这些仅在重新启动应用程序时才会刷新。我读过一些关于 lookupPrintServices() 应该在新线程中完成以获取打印机的内容。然而,这没有用,打印机列表保持不变。 following link表明这个问题应该在 Java 5.0 中得到修复,我做错了什么吗?

非常感谢任何帮助!

编辑添加了 MWE。

public class MTPrinterTest extends Thread {
public static void main(String[] args) {
MTPrinterTest t1 = new MTPrinterTest();
t1.start();

try {
System.in.read();
} catch (Exception e){}

MTPrinterTest t2 = new MTPrinterTest();
t2.start();
}
public void run() {
PrinterJob printerJob;
PrintService[] printServices;

printerJob = PrinterJob.getPrinterJob();
printServices = printerJob.lookupPrintServices();
System.out.println("Number of servies found: " + printServices.length);
for (int i =0; i< printServices.length; i++)
System.out.println("--> Available Printer " + i + ": " + printServices[i]);
printerJob.printDialog();
}
}

最佳答案

无需重启应用程序即可刷新打印服务列表。

Here我找到了解决方案:

/**
* Printer list does not necessarily refresh if you change the list of
* printers within the O/S; you can run this to refresh if necessary.
*/
public static void refreshSystemPrinterList() {
Class<?>[] classes = PrintServiceLookup.class.getDeclaredClasses();
for (Class<?> clazz : classes) {
if ("javax.print.PrintServiceLookup$Services".equals(clazz.getName())) {
// sun.awt.AppContext.getAppContext().remove(clazz);
// Use reflection to avoid "Access restriction" error message
try {
Class<?> acClass = Class.forName("sun.awt.AppContext");
Object appContext = acClass.getMethod("getAppContext").invoke(null);
acClass.getMethod("remove", Object.class).invoke(appContext, clazz);
} catch (Exception e) {
}
break;
}
}
}

基本上,静态类 PrintServiceLookup.Services 维护打印服务列表。因此,如果您从 AppContext 中删除此类,您将强制 PrintServiceLookup 再次创建一个新实例。因此,打印服务列表得到刷新。

关于java - 在应用程序运行时用 Java 刷新打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28455914/

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