用Java打印JTable和其他文本字段

Red*_*one 5 java printing swing

我正在为我的项目工作开发一个Java桌面应用程序.我需要打印一张包含子总计和总字段以及表格数据的发票JTable.我能够打印表格,但不能在同一页面打印.即JTable打印在第一页和小计,总打印在下一页.有没有办法在同一页面中打印两个数据.我不想使用报告引擎.只需使用内置的java打印服务.请指导我.

我想要的打印格式:

在此输入图像描述

下图显示了GUI

在此输入图像描述

下图显示了我到目前为止的报告.它的格式不正确.请帮忙

在此输入图像描述

代码如下

        JLabel title = new JLabel();
        title.setText("Invoice");
        title.setBounds(300, 200, 80, 30);


        JTextField subTotal = new JTextField();
        subTotal.setText("Sub Total : Rs. " + SubTotal.getText());
        subTotal.setBounds(400, 200, 150, 30);


        MyPrintable prt = new MyPrintable();
        prt.addComponent(title);
        prt.addComponent(billTable); //billTable is the JTable
        prt.addComponent(subTotal);
        prt.printIt();
Run Code Online (Sandbox Code Playgroud)

以下是我的Printable课程

class MyPrintable implements Printable
{
private ArrayList<JComponent> items;

public MyPrintable()
{
    items = new ArrayList<>();
}
@Override
public int print(Graphics g, PageFormat pf, int page) throws PrinterException
{
    if(page > 0) return Printable.NO_SUCH_PAGE;
    Graphics2D g2 = (Graphics2D)g;
    g2.translate(pf.getImageableX(), pf.getImageableY());


    for(JComponent item : items)
    {
        item.setLayout(null);
      //  item.setBounds(500, 500, 200, 200);
        item.printAll(g);
        g2.translate(0, item.getHeight());
    }
    return Printable.PAGE_EXISTS;
}

public void printIt()
{
    PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();;
    PrinterJob job = PrinterJob.getPrinterJob();
    try
    {
        job.setPrintable(this);
        if(job.printDialog(attributes))
            job.print(attributes);
    }
    catch (PrinterException e)
    {
        JOptionPane.showMessageDialog(null, e);
    }
}

public void addComponent(JComponent component) { items.add(component); }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kyy 2

如果您想在您设置的坐标处打印所有内容,您要么需要创建一个新面板,在该面板中布置要打印的所有组件,然后打印该面板,要么需要将所有组件翻译为您的打印方法到正确的坐标。

第二种方式看起来像

public int print(Graphics g, PageFormat pf, int page) throws PrinterException
{
    if(page > 0) return Printable.NO_SUCH_PAGE;
    Graphics2D g2 = (Graphics2D)g;
    g2.translate(pf.getImageableX(), pf.getImageableY());


    for(JComponent item : items)
    {
        g2.translate(item.getX(), item.getY());
        item.printAll(g);
        g2.translate(-item.getX(), -item.getY()); // bring all back to default coordinates
    }
    return Printable.PAGE_EXISTS;
}
Run Code Online (Sandbox Code Playgroud)