Avatar billede cryptoknight Nybegynder
12. april 2002 - 12:50 Der er 13 kommentarer og
1 løsning

Print i Java

Det kan godt ske der er mange spørgsmå herinde, der behandler dette emne, men jeg har altså ikke kunne finde noget JEG kunne bruge til noget!

Jeg skal have udskrevet en string (en lang string med escape characters som \t og \n ). Den skal ikke vise et vindue med en knap man skal trykke på, for det HAR man gjort et andet sted.

Min idé er at lave noget i stil med et JTextArea og skrive dét ud, men jeg kan sq ikke få det til at virke.

Der gives kun point for konkrete løsninger! (derfor så mange point)
Avatar billede cryptoknight Nybegynder
12. april 2002 - 12:52 #1
(t og n = tab og linjeskift)
Avatar billede carstenknudsen Nybegynder
13. april 2002 - 10:44 #2
Konkretiser hvad du ønsker, mener du
print til printer eller print til
et grafikkomponent eller en stream.
Hvis du har f.eks. et JTextArea eller
en hvilken som helst JComponent er det
relativt let at printe ud. Jeg skal gerne
smide en klasse op som gør det for dig.
Avatar billede cryptoknight Nybegynder
13. april 2002 - 11:01 #3
Jeg har nogle strenge som jeg gerne vil have udskrevet på printeren.
Avatar billede carstenknudsen Nybegynder
13. april 2002 - 12:59 #4
Hvis du vil have skrevet et par strenge
s1 og s2 ud kan du bruge følgende kode:

JTextArea textArea = new JTextArea(20,20);
textArea.append( s1 );
textArea.append(System.getProperty("line.separator"));
textArea.append( s2 );
ComponentPrinter.makePrintable( textArea );
hvorefter du skal aktivere dit JTextArea
og taste ctrl-p så kan du få skrevet
teksten ud.
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
public class ComponentPrinter implements Printable {
    private Component c;
    /**
    * Constructor for class ComponentPrinter that
    * takes a Component as an argument.
    * @param c Component that we wish to print.
    **/
    public ComponentPrinter( Component c ) {
    this.c = c;
    } // constructor

    /**
    * The method print sets up the PrinterJob.
    **/
    public void print() throws PrinterException {
    PrinterJob job = PrinterJob.getPrinterJob();
    PageFormat format = job.pageDialog( job.defaultPage() );
    job.setPrintable( this, format );
    if ( job.printDialog() )
        job.print();
    } // print

    /**
    * The method print is called by PrinterJob.
    **/
    public int print( Graphics g, PageFormat format, int pagenum ) {
    if ( pagenum > 0 )
        return Printable.NO_SUCH_PAGE;
    Graphics2D g2 = (Graphics2D)g;
    g2.translate( format.getImageableX(), format.getImageableY() );
    c.paint( g2 );
    return Printable.PAGE_EXISTS;
    } // print

    /**
    * The static method makePrintable registers a key listener on
    * the component, and when the user presses ctrl-p key the
    * contents can be printed directly on a printer.
    **/
    public static void makePrintable( final Component c ) {
    c.addKeyListener( new KeyAdapter() {
        public void keyPressed( KeyEvent e ) {
            if ( e.getKeyCode() == KeyEvent.VK_P && e.isControlDown() ) {
            ComponentPrinter printer = new ComponentPrinter( c );
            try {
                printer.print();
            } // try
            catch ( PrinterException pe ) {
            } // catch
            } // if
        } // keyPressed
        } // KeyAdapter
              );
    } // makePrintable

} // ComponentPrinter
Avatar billede cryptoknight Nybegynder
13. april 2002 - 13:48 #5
næææææsten perfekt... :(

Er der ikke en måde man kan komme uden om at skulle trykke ctrl-p??
(jeg har prøvet at fjerne key-event'en, men så skriver den bare en tom side ud)
Avatar billede cryptoknight Nybegynder
13. april 2002 - 13:50 #6
(jeg kan ikke gøre for det, jeg er perfektionist...)
Avatar billede carstenknudsen Nybegynder
13. april 2002 - 14:22 #7
Jo, det kan du godt; i forlængelse af det tidligere
eksempel kan du istedet for at registrere
din Component oprette en ComponentPrinter direkte:
ComponentPrinter cp = new  ComponentPrinter( textArea );
cp.print();
Dog skal du være opmærksom på at print()
metoden kan kaste en PrinterException.
Avatar billede cryptoknight Nybegynder
13. april 2002 - 14:47 #8
Tak. det var lige det jeg skulle bruge.
Avatar billede cryptoknight Nybegynder
14. april 2002 - 20:08 #9
liiige en lille-bitte ting mere...:
hvordan håndterer jeg, at min tekst ikke kan være på en side? Jeg trode faktisk den tog højde for dette og bare udskrev flere sider, men den skriver kun det der kan være på første side. (Resten må man så gætte sig til...?)

Jeg kan jo selvfølgelig tjekke om antal rows er større end et-eller-andet og så lave et nyt JTextArea med med resten af teksten, men vil den så ikke spørge om man vil udskrive flere gange? Dette er ikke optimalt, hvis man f.eks skal have skrevet 20 sider ud.
Avatar billede carstenknudsen Nybegynder
14. april 2002 - 20:50 #10
Klassen er lavet til at udskrive en
enkelt komponent eller rettere den
del af den der er synlig. Hmmm det
må jeg lige tænke over.
Avatar billede cryptoknight Nybegynder
18. april 2002 - 14:48 #11
du har ikke fundet ud af noget endnu??

Hvad med at bruge OS'ets printrutine, er det helt umuligt (meaning: kan JEG finde ud af det?)

btw, når jeg prøver at ændre skrift-type på textarray'et, får jeg en system-fejl, der lukker mit udviklingsværktøj. (Jeg Bruger VisualAge (ja, jeg ved godt det sux, men...))

/cryptoknight
Avatar billede carstenknudsen Nybegynder
18. april 2002 - 14:53 #12
Jeg har fundet et eksempel i Java FC (Nutshell serien)
hvor der er et eksempel. Jeg vil skrive det ind senere
i aften (når jeg kommer fra arbejde); jeg har ikke
afprøvet det, men det kan tage en fil eller en streng
og dele den op i forskellige sider. Hvis jeg ikke skriver
i aften skal du bare rykke mig i morgen formiddag!
Avatar billede carstenknudsen Nybegynder
18. april 2002 - 15:36 #13
Her er en midlertidig løsning, der er problemer med
tabs såvidt jeg kan bedømme, men ellers kommer
der et par fine sider ud. Jeg skal nok pudse den
lidt af imorgen eller iaften.
import java.awt.*;
import java.awt.print.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class TextPrinter implements Pageable, Printable {

    private String fontFamily = "Monospaced";
    private int fontStyle = Font.PLAIN;
    private int fontSize = 10;
    private float lineSpaceFactor = 1.1f;
    private int lineSpacing;
    private int linesPerPage;
    private int numberOfPages;
    private int baseline = -1;
    private PageFormat format;
    private Font font;
    private List lines;

    public TextPrinter( String text, PageFormat format ) throws IOException {
    this( new StringReader( text ), format );
    } // constructor

    public TextPrinter( File file, PageFormat format ) throws IOException {
    this( new FileReader( file ), format );
    } // constructor

    public TextPrinter( Reader reader, PageFormat format ) throws IOException {
    this.format = format;
    BufferedReader breader = new BufferedReader( reader );
    lines = new ArrayList();
    String line;
    while ( ( line = breader.readLine() ) != null ) {
        lines.add( line );
    } // while
        setFont( new Font( fontFamily, fontStyle, fontSize ) );
    } // constructor

    public void setFont( Font font ) {
    this.font = font;
    lineSpacing = (int)( font.getSize() * lineSpaceFactor );
    linesPerPage = (int)Math.floor( format.getImageableHeight() / lineSpacing );
    numberOfPages = ( lines.size() - 1 ) / linesPerPage + 1;
    } // setFont

    ////////////////////////////////
    // implementation of Pageable //
    ////////////////////////////////

    public int getNumberOfPages() {
    return numberOfPages;
    } // getNumberOfPages

    public PageFormat getPageFormat( int pageNumber ) {
    return format;
    } // getPageFormat

    public Printable getPrintable( int pageNumber ) {
    return this;
    } // getPrintable

    /////////////////////////////////
    // implementation of Printable //
    /////////////////////////////////

    public int print( Graphics g, PageFormat format, 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)format.getImageableX(), (int)format.getImageableY(),
            (int)format.getImageableWidth(), (int)format.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)format.getImageableX();
    int y0 = (int)format.getImageableY();
    for (int i = startLine; i <= endLine; i++) {
        String line = (String)lines.get( i );
        if ( line.length() > 0 ) {
        g.drawString( line, x0, y0 );
        } // if
        y0 += lineSpacing;
    } // for
    return PAGE_EXISTS;
    } // print

    public static void main( String[] args ) throws IOException, PrinterException {
    PrinterJob job = PrinterJob.getPrinterJob();
    PageFormat format = job.pageDialog( job.defaultPage() );
    job.setPageable( new TextPrinter( new File( args[ 0 ] ), format ) );
    if ( job.printDialog() ) {
        job.print();
    } // if
    } // main

} // TextPrinter
Avatar billede carstenknudsen Nybegynder
19. april 2002 - 09:55 #14
Her er en lettere opdateret version hvor du
kan sætte fonten udefra. Det er ikke en optimal
løsning men den ser ud til at virke. Husk at
hvis du bruger en font der ikke er monospaced
ser programlistningerne ikke pæne ud. Tabs
har jeg forsøgt at håndtere men det er heller
ikke helt optimalt. Håber det virker for dig.
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

    public static void main( String[] args ) throws IOException, PrinterException {
    PrinterJob job = PrinterJob.getPrinterJob();
    PageFormat pageFormat = job.pageDialog( job.defaultPage() );
    TextPrinter textPrinter = new TextPrinter( new File( args[ 0 ] ), pageFormat );
    //textPrinter.setFont( new Font( "Helvetica", Font.ITALIC, 12 ) );
    job.setPageable( textPrinter );
    if ( job.printDialog() ) {
        job.print();
    } // if
    System.exit( 0 );
    } // main
   
} // TextPrinter
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