2016-09-16 105 views
5

Proje çalışmam için Java'da bir masaüstü uygulaması geliştiriyorum. Alt toplam ve toplam alanlara sahip bir faturayı JTable'dan tablo verileriyle birlikte yazdırmam gerekiyor. Tabloyu yazdırabilirim ancak aynı sayfada değil. JTable, ilk sayfada ve alt toplamda, bir sonraki sayfadaki toplam baskılarda yazdırır. Her iki veriyi aynı sayfaya yazdırmanın bir yolu var mı? Raporlama motorlarını kullanmak istemiyorum. Sadece dahili java yazdırma servislerini kullanın. Lütfen bana yol göster. Istediğim gibiJTable ve Java'daki diğer textfields yazdırma

Baskı Biçimi:

enter image description here

ardından figür Kullanıcı arabirimi

enter image description here

gösterir Ve Aşağıdaki şekilde ben şimdiye kadar alıyorum raporu gösterir. Onun doğru biçimde değil.

 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(); 

aşağıdaki Ve altındaki My Yazdırılabilir sınıftır olarak yardım edin

enter image description here

Kod olan

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); } 
} 
+0

benzeyecek? –

+0

@SergiyMedvynskyy Soruyu düzenledim. – Redone

+0

Kodunuzu görmeden size nasıl yardımcı olabilirim? Lütfen bir [SSCCE] (http://sscce.org) sağlayın, yani ben (veya başka biri) size yardımcı olmaya çalışıyorum. –

cevap

2

Eğer ettik koordinatlarda tüm eşyalarını yazdırmak istiyorsanız set, yeni bir panel oluşturmanız, bu panele yazdırmak için tüm bileşeninizi yerleştirmeniz ve bu paneli yazdırmanız ya da priinizdeki tüm bileşenleri çevirmeniz gerekir. Doğru koordinatlara nt yöntemi.

İkinci yol bunu tek ihtiyacınız personeli ile bir sayfayı (panel) oluşturmak ve yazdırmak için denediniz

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; 
}