有关java打印问题。。。。

package com.test;

import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.PrinterName;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class Te extends JFrame {
    private PrintRequestAttributeSet attributes;

    public Te() {
        try {

            attributes = new HashPrintRequestAttributeSet();
            PrinterJob job = PrinterJob.getPrinterJob();
            attributes.add(new Copies(1)); // 设置打印分数
            attributes.add(OrientationRequested.PORTRAIT); // 设置打印方向
            attributes.add(MediaSizeName.ISO_A6); // 设置打印纸装
            HashAttributeSet hs = new HashAttributeSet();
            hs.add(new PrinterName("zhushi", null));
            PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, hs);
            job.setPrintService(pss[0]);
            PrintPanel printTable = new  PrintPanel(); 
            int hei = printTable.getHeight2();
            attributes.add(new MediaPrintableArea(0,0,58,hei,MediaPrintableArea.MM));   //设置打印纸装大小
            job.setPrintable(printTable);
            job.print(attributes);
        } catch (Exception e) {

        }

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(1212);
        Te te = new Te();

    }


}

class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {
    public TableCellTextAreaRenderer() {
        setLineWrap(true);
        setWrapStyleWord(true);
    }
    
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        // 计算当下行的最佳高度
        int maxPreferredHeight = 0;
        for (int i = 0; i < table.getColumnCount(); i++) {
            setText("" + table.getValueAt(row, i));
            setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
            maxPreferredHeight = Math.max(maxPreferredHeight,
                    getPreferredSize().height);
        }

        if (table.getRowHeight(row) != maxPreferredHeight) // 少了这行则处理器瞎忙
            table.setRowHeight(row, maxPreferredHeight);

        setText(value == null ? "" : value.toString());
        System.err.println(value+" vvvvvvvvvvvvvv");
        System.err.println(maxPreferredHeight+" sssssssssssssssssss");
        /*hei += maxPreferredHeight;
        System.out.println(hei);*/
        return this;
    }
//  public static int hei =0;
//  public int getHei(JTable table, Object value,
//          boolean isSelected, boolean hasFocus, int row, int column) {
//      // 计算当下行的最佳高度
//      int maxPreferredHeight = 0;
//      for (int i = 0; i < table.getColumnCount(); i++) {
//          setText("" + table.getValueAt(row, i));
//          setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
//          maxPreferredHeight = Math.max(maxPreferredHeight,
//                  getPreferredSize().height);
//      }
//      return hei += maxPreferredHeight;
//  }
}
class PrintPanel extends JPanel implements Printable{
    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
            throws PrinterException {
        if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;
            Graphics2D g2 = (Graphics2D) graphics;
            g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
            drawPage1(graphics);
        return Printable.PAGE_EXISTS;
    }
    
    public void drawPage1(Graphics g2){
         JTable table   =   new   JTable(8,3); 
         TableColumn column=null;
         table.setFont(new Font("Dialog ",   0,   12));
         table.getColumnModel().getColumn(0).setMinWidth(100);
         table.setModel(new  javax.swing.table.DefaultTableModel( 
                getObject(),
                 new String[] {"","",""} 
         )   { 
                 boolean[] canEdit   = new   boolean[]
                         {true,true,true}; 
         });
//       table.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer());
         table.setSize(table.getPreferredSize());
         table.setShowGrid (false);//是否显示网格线
         table.setShowHorizontalLines (false);//是否显示水平的网格线
         table.setShowVerticalLines (false);//是否显示垂直的网格线
         table.paint(g2);
    }
    public Object[][] getObject() {
        Object[][] os = new Object[13][3];
        for (int i = 0; i < 2; i++) {
            os[i][0] =  "里单元格里单元格";
            os[i][1] = "里单元格";
            os[i][2] = "";
        }
        return os;
    }
    
    public int getHeight2() {
         JTable table   =   new   JTable(8,3); 
         TableColumn column=null;
         table.setFont(new Font("Dialog ",   0,   12));
         table.getColumnModel().getColumn(0).setMinWidth(100);
         table.setModel(new  javax.swing.table.DefaultTableModel( 
                getObject(),
                 new String[] {"","",""} 
         )   { 
                 boolean[] canEdit   = new   boolean[]
                         {true,true,true}; 
         });
         table.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer());
         table.setSize(table.getPreferredSize());
         table.setShowGrid (false);//是否显示网格线
         table.setShowHorizontalLines (false);//是否显示水平的网格线
         table.setShowVerticalLines (false);//是否显示垂直的网格线
         System.out.println(5*table.getRowCount()+"5*table.getRowCount()");
         return 5*table.getRowCount();
    }
}

 

我本机上装了一个PDF虚拟打印机。

以上是测试类的代码,请各位指点一二。

如何让打印的内容过长也全部打印出来。 不管我怎么调打印都不全。。

请各位指教! 谢谢!!!

哦,了解了,Qq聊。

这主要是计算分页的问题。
这里写死了,所以总共就打印一页,多的内容就憋到页面外面去了。
[quote]if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;[/quote]

这玩意貌似要根据每页的高度,每行文字的高度来计算出每页可以打印多少行,然后再在print方法里根据pageIndex画出当前页的文本内容。我改写了一下你的PrintPanel类,可以支持多页打印,做例子供参考一下吧,希望能帮的上忙,呵呵。

参考资料:http://download.oracle.com/javase/tutorial/2d/printing/set.html

[code="java"]class PrintPanel extends JPanel implements Printable {

private int[] pageBreaks;               //每个分页的开始行号
private String[][] lineContents = null; //打印的文本内容
private int linesPerPage = 20;          //每页的行数,默认20    
private boolean inited = false;         //分页属性是否已初始化

public PrintPanel() {
    initLineContents();
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
        throws PrinterException {

    if(!inited) {
        initPageProperties(graphics, pageFormat);
    }

    if (pageIndex > pageBreaks.length) {
        return NO_SUCH_PAGE;
    }

    Graphics2D g2 = (Graphics2D) graphics;
    g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    drawPage1(graphics, getLineContentsByPageIndex(pageIndex));
    return Printable.PAGE_EXISTS;
}

public void drawPage1(Graphics g2, String[][] lines) {
    JTable table = new JTable(8, 3);
    TableColumn column = null;
    table.setFont(new Font("Dialog", 0, 12));
    table.getColumnModel().getColumn(0).setMinWidth(100);
    table.setModel(new javax.swing.table.DefaultTableModel(lines,
            new String[] { "", "", "" }) {
        boolean[] canEdit = new boolean[] { true, true, true };
    });
    // table.setDefaultRenderer(Object.class, new
    // TableCellTextAreaRenderer());
    table.setSize(table.getPreferredSize());
    table.setShowGrid(false);// 是否显示网格线
    table.setShowHorizontalLines(false);// 是否显示水平的网格线
    table.setShowVerticalLines(false);// 是否显示垂直的网格线
    table.paint(g2);
}

public int getHeight2() {
    JTable table = new JTable(8, 3);
    TableColumn column = null;
    table.setFont(new Font("Dialog ", 0, 12));
    table.getColumnModel().getColumn(0).setMinWidth(100);
    table.setModel(new javax.swing.table.DefaultTableModel(lineContents,
            new String[] { "", "", "" }) {
        boolean[] canEdit = new boolean[] { true, true, true };
    });
    table.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer());
    table.setSize(table.getPreferredSize());
    table.setShowGrid(false);// 是否显示网格线
    table.setShowHorizontalLines(false);// 是否显示水平的网格线
    table.setShowVerticalLines(false);// 是否显示垂直的网格线
    System.out.println(5 * table.getRowCount() + "5*table.getRowCount()");
    return 5 * table.getRowCount();
}

//初始化打印内容
private void initLineContents() {
    lineContents = new String[131][3];
    for (int i = 0; i < 131; i++) {
        lineContents[i][0] = i + "里单元格里单元格";
        lineContents[i][1] = "里单元格";
        lineContents[i][2] = "";
    }
}

//初始化分页属性
private void initPageProperties(Graphics graphics, PageFormat pageFormat) {
    //计算每行高度
    Font font = new Font("Dialog", 0, 12);
    FontMetrics metrics = graphics.getFontMetrics(font);
    int lineHeight =  metrics.getHeight();

    //计算分页
    linesPerPage = (int) (pageFormat.getImageableHeight() / lineHeight - 1);
    int numBreaks = (lineContents.length - 1) / linesPerPage;
    pageBreaks = new int[numBreaks];
    for (int b = 0; b < numBreaks; b++) {
        pageBreaks[b] = (b + 1) * linesPerPage;
    }
    inited = true;
}

//获取当前页的打印内容
private String[][] getLineContentsByPageIndex(int pageIndex) {
    int start = (pageIndex == 0) ? 0 : pageBreaks[pageIndex - 1];
    int end = (pageIndex == pageBreaks.length) ? lineContents.length
            : pageBreaks[pageIndex];
    String[][] res = new String[end - start][];
    for (int i = 0, line = start; line < end; line++, i++) {
        res[i] = lineContents[line];
    }
    return res;
}

}[/code]