Avatar billede elites Nybegynder
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;
}
Avatar billede aslan Nybegynder
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; }

}
Avatar billede elites Nybegynder
30. august 2002 - 13:52 #2
Kan du ikke udspecificere koden, der fotæller at vi har med flere sider at gøre!!!
Avatar billede magoo20000 Nybegynder
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
Avatar billede elites Nybegynder
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!! :)
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