30. august 2002 - 13:44
Der er
4 kommentarer
Udskrivning af JTextPane der fylder mere end én side????
Hej Jeg har en JTextPane, der indeholder et document.. Når jeg prøver at udskrive dette, udskriver den kun 1 side, selvom at dokumentet indeholder 2 sider!!! Hvordan kan man udskrive mere end En side... // Min komponent printer klasse import java.awt.*; import java.awt.print.*; import javax.swing.JComponent; public class ComponentPrintable implements Printable { public ComponentPrintable(Component c) { mComponent = c; } public int print(Graphics g, PageFormat pageFormat, int pageIndex) { if (pageIndex > 0) return NO_SUCH_PAGE; Graphics2D g2 = (Graphics2D)g; g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); boolean wasBuffered = disableDoubleBuffering(mComponent); mComponent.paint(g2); restoreDoubleBuffering(mComponent, wasBuffered); return PAGE_EXISTS; } private boolean disableDoubleBuffering(Component c) { if (c instanceof JComponent == false) { return false; } JComponent jc = (JComponent)c; boolean wasBuffered = jc.isDoubleBuffered(); jc.setDoubleBuffered(false); return wasBuffered; } private void restoreDoubleBuffering(Component c, boolean wasBuffered) { if (c instanceof JComponent) { ((JComponent)c).setDoubleBuffered(wasBuffered); } } private Component mComponent; }
Annonceindlæg fra Pointsharp
30. august 2002 - 13:46
#1
public void udskriv() { RepaintManager.currentManager(this).setDoubleBufferingEnabled(false); PrinterJob pj=PrinterJob.getPrinterJob(); pj.setPrintable(Kvittering.this);//Kvittering er navnet på klassen! pj.printDialog(); try{ pj.print(); }catch (Exception ex) {System.out.println(ex);} } public void onPrint() { PrinterJob printJob = PrinterJob.getPrinterJob(); PageFormat pf = printJob.defaultPage(); pf.setOrientation(PageFormat.PORTRAIT); printJob.validatePage(pf); printJob.setPrintable(this); if (printJob.printDialog()) { try { printJob.print(); } catch (Exception ex) { System.out.println(ex); } } } public int print (Graphics g, PageFormat pf, int pageIndex) { double escala=1; int nbPages=0; Graphics h; double pageHeight = 0; double pageWidth = 0; try { pageWidth=pf.getImageableWidth(); pageHeight=pf.getImageableHeight(); escala=pageWidth/getWidth(); System.out.println("page width : "+pageWidth); System.out.println("escala : "+ escala); nbPages=(int)Math.ceil((escala*getHeight())/pageHeight); System.out.println("num paginas : "+ nbPages); Graphics2D g2 = (Graphics2D)g; System.out.println("print page index : "+pageIndex); if (pageIndex >= nbPages) return NO_SUCH_PAGE; g2.translate(pf.getImageableX(), pf.getImageableY()); g2.translate(0f, -pageIndex*pageHeight); g2.scale(escala,escala); disableDoubleBuffering(this); this.paint(g2); enableDoubleBuffering(this); return PAGE_EXISTS; } catch (Exception e) { e.printStackTrace(); return NO_SUCH_PAGE; } }
30. august 2002 - 13:52
#2
Kan du ikke udspecificere koden, der fotæller at vi har med flere sider at gøre!!!
31. august 2002 - 16:15
#3
Dette løser dit problem! Du skal lave en ActionListener på din knap som denne klasse:*/ public class PrintListener implements ActionListener { private JTextArea text; public PrintListener(JTextArea text) { this.text = text; } public void actionPerformed(ActionEvent ae) { PrinterJob job = PrinterJob.getPrinterJob(); PageFormat pageFormat = job.pageDialog( job.defaultPage() ); TextPrinter textPrinter = new TextPrinter( text.getText(), pageFormat ); job.setPageable( textPrinter ); if ( job.printDialog() ) { job.print(); } // if } } I din egen klasse skal du altså have noget som: JButton button = ...; JTextArea text = ...; button.addActionListener(new PrintListener(text)); Klassen er defineret her: import java.awt.*; import java.awt.print.*; import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.List; public class TextPrinter implements Pageable, Printable, Serializable { private String defaultFontFamily = "Monospaced"; private int defaultFontStyle = Font.PLAIN; private int defaultFontSize = 10; private float lineSpaceFactor = 1.2f; private int lineSpacing; private int linesPerPage; private int numberOfPages; //!!!!!!!!!!!!!!!!!!!!!! private int baseline = -1; private PageFormat pageFormat; private Font font; private List lines; public TextPrinter( String text, PageFormat pageFormat ) throws IOException { this( new StringReader( text ), pageFormat ); } // constructor public TextPrinter( File file, PageFormat pageFormat ) throws IOException { this( new FileReader( file ), pageFormat ); } // constructor public TextPrinter( Reader reader, PageFormat pageFormat ) throws IOException { this.pageFormat = pageFormat; BufferedReader breader = new BufferedReader( reader ); lines = new ArrayList(); String line; while ( ( line = breader.readLine() ) != null ) { lines.add( line ); } // while breader.close(); setFont( new Font( defaultFontFamily, defaultFontStyle, defaultFontSize ) ); } // constructor public void setFont( Font font ) { this.font = font; lineSpacing = (int)( font.getSize() * lineSpaceFactor ); linesPerPage = (int)Math.floor( pageFormat.getImageableHeight() / lineSpacing ); numberOfPages = ( lines.size() - 1 ) / linesPerPage + 1; } // setFont //////////////////////////////// // implementation of Pageable // //////////////////////////////// public int getNumberOfPages() { return numberOfPages; } // getNumberOfPages public PageFormat getPageFormat( int pageNumber ) { return pageFormat; } // getPageFormat public Printable getPrintable( int pageNumber ) { return this; } // getPrintable ///////////////////////////////// // implementation of Printable // ///////////////////////////////// public int print( Graphics g, PageFormat pageFormat, int pageNumber ) { if ( pageNumber < 0 || pageNumber >= numberOfPages ) return NO_SUCH_PAGE; if ( baseline == -1 ) { FontMetrics fm = g.getFontMetrics( font ); baseline = fm.getAscent(); } // if g.setColor( Color.white ); g.fillRect( (int)pageFormat.getImageableX(), (int)pageFormat.getImageableY(), (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight() ); g.setFont( font ); g.setColor( Color.black ); int startLine = pageNumber * linesPerPage; int endLine = startLine + linesPerPage - 1; if ( endLine >= lines.size() ) { endLine = lines.size() - 1; } // if int x0 = (int)pageFormat.getImageableX(); int y0 = (int)pageFormat.getImageableY(); y0 += lineSpacing; for (int i = startLine; i <= endLine; i++) { String line = (String)lines.get( i ); int index; while ( ( index = line.indexOf( "\t" ) ) >= 0 ) { line = line.substring( 0, index ) + " " + line.substring( index + 1 ); } // while if ( line.length() > 0 ) { g.drawString( line, x0, y0 ); } // if y0 += lineSpacing; } // for return PAGE_EXISTS; } // print } // TextPrinter
02. september 2002 - 07:41
#4
Hej magoo... Skal lige på arbejde nu her, men glæder mig til at komme hjem og prøve det... Det ser fornuftigt ud!! Takker indtil videre!! :)
Kurser inden for grundlæggende programmering