Java 通过自定义可打印类进行JTable打印

Java 通过自定义可打印类进行JTable打印,java,swing,printing,jtable,Java,Swing,Printing,Jtable,我有一个JTable,用于捕获用户输入,稍后在点击打印按钮时打印。我有一个图像,我想成为页眉,另一个是页脚。可以找到显示这一点的图像。我遵循了我从中找到的例子。我希望它完全按照TablePrintdemo3中的方式进行 请允许我在这里发布课程。 这是我的第一节课: public class Product { String productDescription; Double productPrice; //dummy properties Integer productQuantity; Do

我有一个
JTable
,用于捕获用户输入,稍后在点击打印按钮时打印。我有一个图像,我想成为页眉,另一个是页脚。可以找到显示这一点的图像。我遵循了我从中找到的例子。我希望它完全按照
TablePrintdemo3
中的方式进行

请允许我在这里发布课程。 这是我的第一节课:

public class Product {
String productDescription;
Double productPrice;
//dummy properties
Integer productQuantity;
Double productTotalAmount;

 public Product() {
    this.productDescription = "";
    this.productPrice = 0.0;
    this.productTotalAmount = 0.0;
    this.productQuantity = 0;

 }//getters and setters here
  }
第二个类是一个自定义模型,如下所示:

public class ProductTableModel extends AbstractTableModel {

private final List<String> columnNames;
private final List<Product> products;

public ProductTableModel() {
    String[] header = new String[] {
        "Quantity",
        "Description",
        "Unity Price",
        "Total Price"
    };
    this.columnNames = Arrays.asList(header);
    this.products = new ArrayList<>();
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 0: return Integer.class;
        case 1: return String.class;
        case 2: return Double.class;
        case 3: return Double.class;
            default: throw new ArrayIndexOutOfBoundsException(columnIndex);
    }
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Product product = this.getProduct(rowIndex);
    switch (columnIndex) {
        case 0: return product.getProductQuantity();
        case 1: return product.getProductDescription();
        case 2: return product.getProductPrice();
        case 3: return product.getProductTotalAmount();
            default: throw new ArrayIndexOutOfBoundsException(columnIndex);
    }
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return true;
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    if (columnIndex < 0 || columnIndex >= getColumnCount()) {
        throw new ArrayIndexOutOfBoundsException(columnIndex);
    } else {
        Product product = this.getProduct(rowIndex);
        switch (columnIndex) {
            case 0: product.setProductQuantity((Integer)aValue); break;
            case 1: product.setProductDescription((String)aValue); break;
            case 2: product.setProductPrice((Double)aValue); break;
            case 3: product.setProductTotalAmount((Double)aValue); break;
        }
        fireTableCellUpdated(rowIndex, columnIndex);
    }
}

@Override
public int getRowCount() {
    return this.products.size();
}

@Override
public int getColumnCount() {
    return this.columnNames.size();
}

@Override
public String getColumnName(int columnIndex) {
    return this.columnNames.get(columnIndex);
}

public void setColumnNames(List<String> columnNames) {
    if (columnNames != null) {
        this.columnNames.clear();
        this.columnNames.addAll(columnNames);
        fireTableStructureChanged();
    }
}

public List<String> getColumnNames() {
    return Collections.unmodifiableList(this.columnNames);
}

public void addProducts(Product product) {
    int rowIndex = this.products.size();
    this.products.add(product);
    fireTableRowsInserted(rowIndex, rowIndex);
}

public void addProducts(List<Product> productList) {
    if (!productList.isEmpty()) {
        int firstRow = this.products.size();
        this.products.addAll(productList);
        int lastRow = this.products.size() - 1;
        fireTableRowsInserted(firstRow, lastRow);
    }
}
 public void addEmptyRow(){
 products.add(new Product());
 this.fireTableRowsInserted(products.size()-1, products.size()-1);
 }
public void insertProduct(Product product, int rowIndex) {
    this.products.add(rowIndex, product);
    fireTableRowsInserted(rowIndex, rowIndex);
}

public void deleteProduct(int rowIndex) {
    if (this.products.remove(this.products.get(rowIndex))) {
        fireTableRowsDeleted(rowIndex, rowIndex);
    }
}

public Product getProduct(int rowIndex) {
    return this.products.get(rowIndex);
}

public List<Product> getProducts() {
    return Collections.unmodifiableList(this.products);
}

public void clearTableModelData() {
    if (!this.products.isEmpty()) {
        int lastRow = products.size() - 1;
        this.products.clear();
        fireTableRowsDeleted(0, lastRow);
    }
  }
}
{

第四节课内容如下:

      public class NiceTablePrinting extends MainClass{

       @Override
       protected JTable initializeTable(TableModel model) {
       return new NicePrintingJTable(model);
        }



private static class NicePrintingJTable extends JTable {

    public NicePrintingJTable(TableModel model) {
        super(model);
        }

    /**
     * Overridden to return a fancier printable, that wraps the default.
     * Ignores the given header and footer. Renders its own header.Always
     * uses the page number as the footer.
     */
    @Override
    public Printable getPrintable(PrintMode printMode,
            MessageFormat headerFormat,
            MessageFormat footerFormat) {

        MessageFormat pageNumber = new MessageFormat("- {0} -");

        /* Fetch the default printable */
        Printable delegate = per.getPrintable(printMode,null,pageNumber);

        /* Return a fancy printable that wraps the default */
        return new NicePrintable(delegate);
        }
       }

     private static class NicePrintable implements Printable {

        Printable delegate; 
        //
        BufferedImage header;
        BufferedImage footer;
        //
        boolean imagesLoaded;

        {
        try{

        header=ImageIO.read(getClass().getResource("images/header.PNG"));
        footer=ImageIO.read(getClass().getResource("images/footer.PNG"));
        imagesLoaded=true;
        }
        catch(IOException ex)
        {

        ex.printStackTrace();
        }
        imagesLoaded=false;
        }

       public NicePrintable(Printable delegate) {
        this.delegate = delegate;
         }

    @Override
    public int      print(Graphicsg,PageFormatpf,intpi)throwsPrinterException   
     public class MainClass {

     private JTable table;
     JFrame frame;
     JButton print;
     JScrollPane sp;
     ProductTableModel model;



    public MainClass(){
    frame= new JFrame("Test Printing");
    frame.setLayout(new java.awt.BorderLayout());
    frame.setVisible(true);
     ///create table
    model=new ProductTableModel();
    table=this.initializeTable(model);
    model.addEmptyRow();

 table.setPreferredScrollableViewportSize(newjava.awt.Dimension(300,300));
    sp= new javax.swing.JScrollPane(table);
    frame.add(sp);
   //button
   print= new JButton("Print");
   frame.add(print,BorderLayout.SOUTH);
   frame.pack();

    print.addActionListener((ActionEvent e) -> {
    try {
        printTable();
    } catch (PrinterException ex) {
         Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE,      null, ex);
    }
        });

       }

    protected JTable initializeTable(TableModel model) {
    return new JTable(model);
        }

     public void printTable() throws PrinterException {
     table.print(JTable.PrintMode.NORMAL, null, null, true, null, true);
    }
    public static void main(String [] args){

       MainClass cl= new MainClass();
     }
   }
我想按照
TablePrintdemo3
中的方式设置我的东西。现在我看不出哪里出了问题。请协助。
问题是它只打印表格-没有页眉和页脚图像。

可能有很多原因1)图像未加载2)大小不正确3)gCopy已处理但您绘制了图像。4)retVal=no\u此类页面。调试程序以查看发生了什么,或提供SSCE以显示您的应用程序problem@StanislavL让我试着调试,但你的意思是我提供的代码不够??我已经在这里发布了所有必要的代码,你可以编译和运行。你的意思是我应该添加getter和setter吗?@StanislavL关于所有可能的原因,你建议我按照
PrintTableDemo3
中的方式进行调试。这有什么问题e?@StanislavL我已经检查过了,图像正在加载,并且被精确地打印在我想要的地方-注意,我使用
Book
类来确保图像正在加载。
     public class MainClass {

     private JTable table;
     JFrame frame;
     JButton print;
     JScrollPane sp;
     ProductTableModel model;



    public MainClass(){
    frame= new JFrame("Test Printing");
    frame.setLayout(new java.awt.BorderLayout());
    frame.setVisible(true);
     ///create table
    model=new ProductTableModel();
    table=this.initializeTable(model);
    model.addEmptyRow();

 table.setPreferredScrollableViewportSize(newjava.awt.Dimension(300,300));
    sp= new javax.swing.JScrollPane(table);
    frame.add(sp);
   //button
   print= new JButton("Print");
   frame.add(print,BorderLayout.SOUTH);
   frame.pack();

    print.addActionListener((ActionEvent e) -> {
    try {
        printTable();
    } catch (PrinterException ex) {
         Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE,      null, ex);
    }
        });

       }

    protected JTable initializeTable(TableModel model) {
    return new JTable(model);
        }

     public void printTable() throws PrinterException {
     table.print(JTable.PrintMode.NORMAL, null, null, true, null, true);
    }
    public static void main(String [] args){

       MainClass cl= new MainClass();
     }
   }