Avatar billede krukken Mester
07. maj 2005 - 17:00 Der er 4 kommentarer og
1 løsning

Udskrivning af JTable til printer

Hej,

Jeg har en række spørgsmål til udprintning fra Java.

1. Skal man kalde paint engang for hvert side man vil udskrive?
2. Hvis man returnere Printable.PAGE_EXISTS fra paint - bliver paint så kaldet igen?
3. Hvor mange gange kan man kalde paint ved at returnere Printable.PAGE_EXISTS
4. Kan man udskrive ting til en side hver gang paint bliver kaldt?
Avatar billede _carsten Nybegynder
07. maj 2005 - 20:44 #1
Tror jeg vil prøve at besvare alle 4 punkter på en gang, da det hele hænger sammen, nu skriver du godt nok "paint", men det er formentlig "print" du tænker på når vi snakker udskrivning.

For at forklare det, skal du prøve at forestille dig du udskriver til en printer med ekstrem lille hukommelse, java deler den side du vil have udskrevet op i nogle bånd. Lad os sige at din printer kun har hukommelse nok til 1 cm af en side (A4 = 29,7 cm), så vil java kalde din print metode 30 gange, 29 gange for de første 29 cm og 1 gang for de sidste 0,7 cm.

Java's holder selv styr på hvor mange bånd der er printet og hvor mange der mangler, du skal kun holde styr sideantal.

Jeg skal prøve om jeg kan nå at lave et eksempel i aften som skriver over flere sider, ellers bliver det først på mandag.
Avatar billede krukken Mester
08. maj 2005 - 12:29 #2
Perfekt - det ville være rigtig lækkert, fordi jeg må indrømme at der stadigvæk er lidt af en gåde for mig.

Ligenu udskriver jeg 30 linier med drawString første gange metoden print bliver kaldt, også returnere jeg Printable.PAGE.EXISTS. Metoder bliver kaldt igen, og der returneres igen Printable.PAGE.EXISTS, men print-metoden bliver nu ikke kaldt igen. Det er meget mærkeligt.
Avatar billede _carsten Nybegynder
09. maj 2005 - 14:36 #3
Prøv at løbe nedenstående eksempel igennem, har prøvet at lave det så overskueligt som muligt - men jeg ved ikke om det er lykkedes.


import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class PrintTest extends javax.swing.JFrame implements Printable{
   
    public PrintTest() {
        initComponents();
    }
   
                       
    private void initComponents() {
        panel = new javax.swing.JPanel();
        addRows = new javax.swing.JButton();
        clearTbl = new javax.swing.JButton();
        printRows = new javax.swing.JButton();
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addRows.setText("Add rows to table");
        addRows.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fillTable(evt);
            }
        });

        panel.add(addRows);

        clearTbl.setText("Clear table");
        clearTbl.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                removeTblRows(evt);
            }
        });

        panel.add(clearTbl);

        printRows.setText("Print table values");
        printRows.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                printTblRows(evt);
            }
        });

        panel.add(printRows);

        getContentPane().add(panel, java.awt.BorderLayout.NORTH);

        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        scroll.setViewportView(table);

        getContentPane().add(scroll, java.awt.BorderLayout.CENTER);

        pack();
    }
                     

    private void removeTblRows(java.awt.event.ActionEvent evt) {                             
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        int i = table.getRowCount() - 1;
        for(int x = i; x >= 0; x--)
                model.removeRow(x);
    }                             

    private void printTblRows(java.awt.event.ActionEvent evt) {                             
        job = PrinterJob.getPrinterJob();
       
        // Hent papirformat som anvendes af default printer
        pageForm = job.defaultPage();
       
        // Antal rækker i tabel, samt rækkehøjde
        rowHeight = table.getRowHeight();
        rowCount = table.getRowCount();

        // Højde på defaultpapir, samt antal rækker der kan være på papiret
        int printArea = (int) (pageForm.getImageableHeight());
        rowsPerPage = (int)Math.floor((double)printArea / (double)rowHeight);
        numberOfPages = (int)Math.ceil((double)rowCount / (double)rowsPerPage );
       
        job.setPrintable(this);

        try{
            System.out.println("Forsøger print");
            job.print();
        }
        catch(PrinterException p){
            p.printStackTrace();
        }

    }                           

    private void fillTable(java.awt.event.ActionEvent evt) {                         
        String svar = JOptionPane.showInputDialog(this, "Skriv det antal rækker tabellen skal indeholde");
       
        if( svar != null){
            int i = Integer.parseInt(svar); // du må selv håndtere fejlmuligheder
           
            int row = table.getRowCount();
           
            DefaultTableModel model = (DefaultTableModel)table.getModel();
            for(int x = 0; x < i;x++){
                model.addRow(new Vector());
                table.setValueAt("Row.: " + (row + x + 1), (row + x), 0);
                table.setValueAt("Cell.: " + ((row + x) *4 + 2), (row + x), 1);
                table.setValueAt("Cell.: " + ((row + x) *4 + 3), (row + x), 2);
                table.setValueAt("Cell.: " + ((row + x) *4 + 4), (row + x), 3);
            }
        }
           
    }                         
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PrintTest().setVisible(true);
            }
        });
    }

    public int print(Graphics g, PageFormat pF, int pageIndex) throws PrinterException {
        if(pageIndex >= 0 && pageIndex < numberOfPages){
            g.translate((int)pF.getImageableX(), (int)pF.getImageableY());
           
            int start = pageIndex * rowsPerPage;
            int stop = (rowCount - start) > rowsPerPage ? rowsPerPage + start : rowCount;
            int lineStart = rowHeight;

            for(int i = start; i < stop; i++){
                g.drawString(table.getValueAt(i, 0).toString(), 10, lineStart);
                g.drawString(table.getValueAt(i, 1).toString(), 100, lineStart);
                g.drawString(table.getValueAt(i, 2).toString(), 200, lineStart);
                g.drawString(table.getValueAt(i, 3).toString(), 300, lineStart);
               
                lineStart += rowHeight;
                System.out.println("Printing row " + (i + 1));
            }
            System.out.println("Page " + (pageIndex + 1) + " done !");
            return Printable.PAGE_EXISTS;
        }
           
        return Printable.NO_SUCH_PAGE;
    }
                   
    private javax.swing.JButton addRows;
    private javax.swing.JButton clearTbl;
    private javax.swing.JPanel panel;
    private javax.swing.JButton printRows;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
                 
    private PrinterJob job;
    private PageFormat pageForm;
    private int numberOfPages;
    private int rowHeight;
    private int rowCount;
    private int rowsPerPage;
}
Avatar billede _carsten Nybegynder
14. maj 2005 - 21:00 #4
Er du kommet videre ????
Avatar billede krukken Mester
14. maj 2005 - 21:55 #5
Ja - men det er lige stillet lidt i bero indtil videre pga. eksamen, men jeg kan helt sikker bruge noget fra dit eksempel.

Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester