如何在一个作业中并排打印多个表?

时间:2014-10-12 14:21:48

标签: java arrays swing jtable jframe

如何并排打印三个不同的表格或在一次打印中将它们一起添加?因为以下代码分别打印并在不同页面中打印。 我对JTable的打印方面知之甚少。

我正在使用NetBeans 8.0。

或者我可以将数据导入excel文件并从那里打印出来吗?这看起来有道理吗? 编辑:打印时,所有三个表必须并排在一起,无论其纵向或横向。如果所有表或连接的表更好,则由多列而不是三个单独的表表示。

 PrinterJob job = PrinterJob.getPrinterJob();
 PrintRequestAttributeSet asset = new HashPrintRequestAttributeSet();
 PageFormat pf = job.pageDialog(asset);
 job.setPrintable(new recording_system(), pf);
 boolean ok = job.printDialog(asset);
 if (ok) {
     try {
         jTstudents.print(JTable.PrintMode.NORMAL);
         jTscores.print(JTable.PrintMode.NORMAL);
         jTresults.print(JTable.PrintMode.NORMAL);
     } catch (PrinterException ex) {
         /* The job did not successfully complete */
     }
}

表格看起来像这样 Student Recording System

1 个答案:

答案 0 :(得分:0)

实现一个结合所有模型的TableModel类。

TableModel model = new ParallelTableModel(jTStudents.getModel(),
                                          jTScores.getModel(),
                                          TResults.getModel());
JTable totalTable = new JTable(model);

复制表头。 然后totalTable.getPrintable进行打印。

/**
 * Table Model composed from side-by-side table models.
 */
public class ParalleTableModel extends AbstractTableModel {

    private final TableModel[] models;

    public ParalleTableModel(TableModel... models) {
        this.models = models;
    }

    @Override
    public int getRowCount() {
        return models[0].getRowCount();
    }

    @Override
    public int getColumnCount() {
        int count = 0;
        for (TableModel model : models) {
            count += model.getColumnCount();
        }
        return count;
    }

    @Override
    public String getColumnName(int columnIndex) {
        int count = 0;
        for (TableModel model : models) {
            int n = model.getColumnCount();
            if (columnIndex < count) {
                return model.getColumnName(columnIndex - count);
            }
            count += n;
        }
        throw new IndexOutOfBoundsException();
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        int count = 0;
        for (TableModel model : models) {
            int n = model.getColumnCount();
            if (columnIndex < count) {
                return model.getColumnClass(columnIndex - count);
            }
            count += n;
        }
        throw new IndexOutOfBoundsException();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        int count = 0;
        for (TableModel model : models) {
            int n = model.getColumnCount();
            if (columnIndex < count) {
                return model.isCellEditable(rowIndex, columnIndex - count);
            }
            count += n;
        }
        throw new IndexOutOfBoundsException();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        int count = 0;
        for (TableModel model : models) {
            int n = model.getColumnCount();
            if (columnIndex < count) {
                return model.getValueAt(rowIndex, columnIndex - count);
            }
            count += n;
        }
        throw new IndexOutOfBoundsException();
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        int count = 0;
        for (TableModel model : models) {
            int n = model.getColumnCount();
            if (columnIndex < count) {
                model.setValueAt(aValue, rowIndex, columnIndex - count);
            }
            count += n;
        }
        throw new IndexOutOfBoundsException();
    }
}