12. april 2002 - 12:50Der 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)
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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
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.
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.
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...))
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!
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
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
//////////////////////////////// // 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
Synes godt om
Ny brugerNybegynder
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.