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