06. januar 2005 - 17:07Der er
11 kommentarer og 1 løsning
Print med præcise koordinater
Jeg skal have printet et girokort fra min java applikation. Og derfor skal jeg have den til at printe et tal præcist på det koordinat på papiret jeg beder den om. Gerne hvor det kan angives cm (og mm) og ikke pixels.
Indtil videre er jeg ved at lege med at printe en ny frame ud, som jeg laver, og placerer komponenter på den. Men så vidt jeg kan forstå, bliver det ikke præcist det samme på alle systemer?
Jeg mener jeg har læst i en tråd, her på eksperten, at GUI'en ikke bliver vist præcist ens på alle skærme... men nu kan jeg selvfølgelig ikke finde det igen :)
Jeg har heller ikke oplevet problemet i praksis, så mon ikke det bare er en fejltolkning fra min side :/
Ja, jeg bruger translate().
Et lille tillægsspørgsmål, som jeg er stødt i senere: Hvilke krav skal egentlig opfyldes for at en frame bliver skrevet ud? Det virker fint, hvis jeg bruger frame.show() først, men hvis ikke, skrives intet ud...
translate() relaterer til getImageableArea og vil forrykke x,y alt afhængig af printer, så den skal du undgå.
Nedenstående eksempel sætter det skrivbare område til samme størrelse som papiret (vel vidende at det ikke kan lade sig gøre at skrive helt ud til kanten af papiret), hvilket betyder at når du skriver på posistion 0,0 svarer det til papirets 0,0
Nedenstående eksempel tegner et rektangle, som også på din printer gerne skulle ligge 20 millimeter fra kanten af papiret hele vejen rundt.
Jeg kunne selvfølgelig godt tænke mig at høre hvis det ikke er tilfældet !!
public class Print implements Printable, java.io.Serializable {
public Print() { pJob = PrinterJob.getPrinterJob(); pageFormat = pJob.defaultPage(); Paper paper = new Paper(); pW = pageFormat.getWidth(); pH = pageFormat.getHeight();
Jammen, det minder utroligt meget om hvad jeg har!
Eneste forskelle er: - jeg har p.setImageableArea(0, 0, 600, 900); p.setSize(600, 900); for at sikre mig A4
- Jeg har g2.translate( format.getImageableX(), format.getImageableY() ); c.paint( g2 ); i stedet for int rectWidth = (int) (pW - (40 * mm)); int rectHeight = (int) (pH - (40 * mm)); g2.drawRect((int)(20 * mm), (int)(20 * mm), rectWidth, rectHeight );
Og hvis jeg nu bare smider g2.translate( format.getImageableX(), format.getImageableY() ); væk. Så virker det stadig...
Det spørgsmål du ikke forstod: Det jeg skal, er at skrive en JPanel ud. Og det virker fint, hvis jeg fremviser dette JPanel i en frame, og viser den på skærmen, og så skriver den ud. Men hvis jeg bare laver dette JPanel, uden at vise det på skærmen, bliver der ikke skrevet noget ud. Hvordan kan det være? Og kan jeg gøre noget, for at det kan ændres?
Ja - translate synkroniserer 0,0 på papirets imageableArea med dit Graphics object "lidt syg forklaring, men kan ikke komme det nærmere pt."
Det tvivler jeg på man kan uden at vise det - men der er vi dybt inde et sted jeg ikke har brugt meget tid på at studere, du kan prøve at kalde doLayout() på dit JPanel som det sidste før udskrivning, tvivler dog på det har nogen effekt.
Men det du laver i dit panel, kan du jo ligeså godt udskrive direkte i stedet for at køre det gennem et panel. Jeg ser ingen grund til at opbygge et panel der ikke skal vises - eller også har jeg bare ikke rigtig fattet spørgsmålet.
Sandt nok. Det gjorde bare tingene lidt lettere, syntes jeg, da jeg fik lidt forærende ved at bruge de objecter der allerede var i swing. Jeg kunne f.x. få noget tekst med en ramme omkring, uden at bekymre mig om, hvor rammen skulle være.
Men sandt! Man kan da altid bare lave det om, hvis det ikke lige virker ;)
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.