这是一个显式创建 ServiceDialog 的示例,它不会阻止原始 JFrame(或任何真正的东西)。
mport sun.print.ServiceDialog;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.print.PrinterJob;
public class TestPrint {
public static void main(String[] args) throws Exception{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton test = new JButton("TEST");
test.addActionListener(evt -> System.out.println("action!"));
frame.getContentPane().add(test, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
final GraphicsConfiguration gc =
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
PrintService service = PrinterJob.getPrinterJob().getPrintService();
ServiceDialog log = new ServiceDialog(gc, 500, 500, service, DocFlavor.SERVICE_FORMATTED.PAGEABLE, new HashPrintRequestAttributeSet(), frame);
log.setModal(false);
log.setVisible(true);
System.out.println("waiting");
}
}
可能不应该做的事情。底部的示例启动了一个运行 jshell 的单独进程并创建了打印对话框。原始 gui 保持响应。
import java.awt.BorderLayout;
import java.awt.print.PrinterJob;
import java.awt.Dialog;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
public class DummyCode {
static void drain(Process proc) throws Exception{
InputStream is = proc.getInputStream();
InputStreamReader reader = new InputStreamReader( is, "UTF8");
new Thread( ()->{
char[] buffer = new char[512];
try{
int read = reader.read(buffer, 0, 512);
while(read >= 0 ){
System.out.println( new String(buffer, 0, read ) );
read = reader.read(buffer, 0, 512);
}
} catch(IOException e){
e.printStackTrace();
}
} ).start();
}
public static void main(String[] args) throws Exception{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton test = new JButton("TEST");
test.addActionListener(evt -> System.out.println("action!"));
frame.getContentPane().add(test, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
Process proc = Runtime.getRuntime().exec("/usr/bin/jshell");
drain(proc);
OutputStream os = proc.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter( os, "UTF8" );
writer.write( "import java.awt.print.PrinterJob;\n");
writer.write( "PrinterJob pj = PrinterJob.getPrinterJob();\n");
writer.write( "pj.pageDialog(pj.defaultPage());\n");
writer.flush();
}
}