初学JAVA,在做一个打印预览的练习
在打开这个打印预览的JDialog后,页面显示正常,但是需要打印的图片无法及时显示出来
应该是draw在canvas里面了,但是没有显示出来,如果我打开其它窗口再回到这个JDialog图片才会出来
页面设置后图片能正常显示,就是在最初打开窗体时,图片无法正常显示出来代码如下:
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import javax.swing.*;
public class PrintPreview extends JDialog implements Printable {
private static final long serialVersionUID=20110208L;
private PrinterJob printer=PrinterJob.getPrinterJob();
private PageFormat pf=new PageFormat();
private double scale=1;
private URL imgURL=this.getClass().getResource("shiki.jpg");
private Image img=Toolkit.getDefaultToolkit().getImage(imgURL);
private PreviewCanvas previewCanvas=null;
private JPanel buttonPane=null;
public PrintPreview() {
init();
}
private void init() {
Container container=this.getContentPane();
this.setTitle("打印预览");
this.setResizable(false);
container.add(getPreviewCanvas(), BorderLayout.CENTER);
container.add(getButtonPane(), BorderLayout.SOUTH);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
private PreviewCanvas getPreviewCanvas() {
if (previewCanvas==null) {
previewCanvas=new PreviewCanvas();
}
return previewCanvas;
}
private JPanel getButtonPane() {
if (buttonPane==null) {
buttonPane=new JPanel(new FlowLayout(FlowLayout.CENTER,50,10));
JButton setUpButton=new JButton("页面设置");
setUpButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pf=printer.pageDialog(pf);
previewCanvas.repaint();
}
});
buttonPane.add(setUpButton);
JButton printButton=new JButton("开始打印");
printButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
printer.print();
} catch (Exception err) {
err.printStackTrace();
}
}
});
buttonPane.add(printButton);
}
return buttonPane;
}
public int print(Graphics graphics,PageFormat pageFormat,int pageIndex) {
double imageableX=pageFormat.getImageableX();
double imageableY=pageFormat.getImageableY();
int imgWidth=img.getWidth(this);
int imgHeight=img.getHeight(this);
graphics.drawImage(img, (int)(imageableX*scale), (int)(imageableY*scale), (int)(imgWidth*scale), (int)(imgHeight*scale), this);
return Printable.PAGE_EXISTS;
}
private class PreviewCanvas extends Canvas {
private static final long serialVersionUID=20110208L;
public PreviewCanvas() {
this.setPreferredSize(new Dimension(595,389));
}
public void paint(Graphics g) {
Graphics2D g2=(Graphics2D)g;
g2.translate(10, 10);
double width=pf.getWidth();
double height=pf.getHeight();
double imageableX=(int)(pf.getImageableX()-1);
double imageableY=(int)(pf.getImageableY()-1);
double imageableWidth=(int)(pf.getImageableWidth()+2);
double imageableHeight=(int)(pf.getImageableHeight()+2);
if (width>575 || height>374) {
double scaleWidth=(double)575/width;
double scaleHeight=(double)374/height;
scale=scaleWidth<scaleHeight?scaleWidth:scaleHeight;
width=width*scale;
height=height*scale;
imageableX=imageableX*scale;
imageableY=imageableY*scale;
imageableWidth=imageableWidth*scale;
imageableHeight=imageableHeight*scale;
}
g2.drawRect(0, 0, (int)width, (int)height);
float[] dash={
5f,
5f
};
g2.setStroke(new BasicStroke(1f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND,10f,dash,0f));
g2.drawRect((int)imageableX, (int)imageableY, (int)imageableWidth, (int)imageableHeight);
PrintPreview.this.print(g2, pf, 0);
}
}
public static void main(String[] args) {
new PrintPreview();
}
}

解决方案 »

  1.   

    swing中绘图一般都不用canvas了,可以在JComponent或者JPanel的paintComponent函数里绘制
      

  2.   

    哦哦,换成JPanel就可以了,原来如此
    感谢
      

  3.   

    OK,测试成功代码如下:
    import java.io.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.print.*;
    import javax.swing.*;public class PrintPreview extends JDialog implements Printable {
    private static final long serialVersionUID = 20110208L;
    private PrinterJob printer = PrinterJob.getPrinterJob();
    private PageFormat pf = new PageFormat();
    private double scale = 1;
    private URL imgURL = this.getClass().getResource("shiki.jpg");
    private Image img = Toolkit.getDefaultToolkit().getImage(imgURL);
    private PreviewCanvas previewCanvas = null;
    private JPanel buttonPane = null; public PrintPreview() {
    init();
    } private void init() {
    Container container = this.getContentPane();
    this.setTitle("打印预览");
    this.setResizable(false);
    container.add(getPreviewCanvas(), BorderLayout.CENTER);
    container.add(getButtonPane(), BorderLayout.SOUTH);
    this.pack();
    this.setLocationRelativeTo(null);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    } private PreviewCanvas getPreviewCanvas() {
    if (previewCanvas == null) {
    previewCanvas = new PreviewCanvas();
    }
    return previewCanvas;
    } private JPanel getButtonPane() {
    if (buttonPane == null) {
    buttonPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 50, 10));
    JButton setUpButton = new JButton("页面设置");
    setUpButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    pf = printer.pageDialog(pf);
    previewCanvas.repaint();
    }
    });
    buttonPane.add(setUpButton);
    JButton printButton = new JButton("开始打印");
    printButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    scale = 1;
    printer.setJobName(new File(imgURL.getFile()).getName());
    printer.setPrintable(PrintPreview.this);
    try {
    printer.print();
    } catch (Exception err) {
    err.printStackTrace();
    }
    }
    });
    buttonPane.add(printButton);
    }
    return buttonPane;
    } public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
    double imageableX = pageFormat.getImageableX();
    double imageableY = pageFormat.getImageableY();
    int imgWidth = img.getWidth(this);
    int imgHeight = img.getHeight(this);
    graphics.drawImage(img, (int) (imageableX * scale),
    (int) (imageableY * scale), (int) (imgWidth * scale),
    (int) (imgHeight * scale), this);
    if (pageIndex == 0) {
    return Printable.PAGE_EXISTS;
    } else {
    return Printable.NO_SUCH_PAGE;
    }
    } private class PreviewCanvas extends JPanel {
    private static final long serialVersionUID = 20110208L; public PreviewCanvas() {
    this.setPreferredSize(new Dimension(595, 389));
    } public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.translate(10, 10);
    double width = pf.getWidth();
    double height = pf.getHeight();
    double imageableX = pf.getImageableX();
    double imageableY = pf.getImageableY();
    double imageableWidth = pf.getImageableWidth();
    double imageableHeight = pf.getImageableHeight();
    if (width > 575 || height > 374) {
    double scaleWidth = (double) 575 / width;
    double scaleHeight = (double) 374 / height;
    scale = scaleWidth < scaleHeight ? scaleWidth : scaleHeight;
    width = width * scale;
    height = height * scale;
    imageableX = imageableX * scale;
    imageableY = imageableY * scale;
    imageableWidth = imageableWidth * scale;
    imageableHeight = imageableHeight * scale;
    }
    g2.drawRect(0, 0, (int) width, (int) height);
    float[] dash = { 5f, 5f };
    g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
    BasicStroke.JOIN_ROUND, 10f, dash, 0f));
    g2.drawRect((int) (imageableX - 1), (int) (imageableY - 1),
    (int) (imageableWidth + 2), (int) (imageableHeight + 2));
    PrintPreview.this.print(g2, pf, 0);
    }
    } public static void main(String[] args) {
    new PrintPreview();
    }
    }