Avatar billede martinhrj Nybegynder
06. januar 2005 - 17:07 Der 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?

Nogen forslag?
Avatar billede martinhrj Nybegynder
23. januar 2005 - 00:26 #1
Hvis det virkelig kan passe, at der slet ingen forslag er, så lukker jeg...
Avatar billede _carsten Nybegynder
23. januar 2005 - 15:33 #2
Hvad har du egentlig prøvet ???

Bruger du translate() ??

Jeg tvivler på at det er forskellige systemer som gør forskellen, men derimod forskellige printere der er årsagen.
Avatar billede martinhrj Nybegynder
25. januar 2005 - 09:12 #3
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...
Avatar billede _carsten Nybegynder
25. januar 2005 - 14:22 #4
Vender tilbage i løbet weekenden, sidder og klapper på en pda, og det gider jeg bare ikke.
Avatar billede _carsten Nybegynder
26. januar 2005 - 20:51 #5
Fandt lige en pc for en kort stund.

double mm = 72/25.4  // svarer til 1 mm på papir

Jeg forstår ikke rigtig dit sidste spørgsmål.
Avatar billede _carsten Nybegynder
27. januar 2005 - 08:40 #6
Det er måske aktuelt med et eksempel ??

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 !!



import java.awt.*;
import java.awt.print.*;
import javax.swing.*;


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();

        paper.setSize(pageFormat.getWidth(), pageFormat.getHeight());
        paper.setImageableArea(0,0, pW,pH);
        pageFormat.setPaper(paper);


        pJob.setPrintable(this, pageFormat);

        try{
            pJob.print();
        }
        catch(java.awt.print.PrinterException p){
            p.printStackTrace();
        }
    }


    public int print(Graphics g, PageFormat pageFormat, int pageIndex)
                        throws java.awt.print.PrinterException{

        if(pageIndex < 0 || pageIndex > 0)
            return Printable.NO_SUCH_PAGE;

        g2 = (Graphics2D)g;

        int rectWidth =  (int) (pW - (40 * mm));
        int rectHeight =  (int) (pH  - (40 * mm));

        g2.drawRect((int)(20 * mm), (int)(20 * mm), rectWidth, rectHeight );

        return Printable.PAGE_EXISTS;
    }

    public static void main(String[] ar){
        new Print();
    }

    private PageFormat pageFormat;
    private Graphics2D g2;
    private double mm = 72/25.4, pW, pH;
    private PrinterJob pJob;
}
Avatar billede martinhrj Nybegynder
27. januar 2005 - 10:55 #7
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?
Avatar billede _carsten Nybegynder
27. januar 2005 - 15:12 #8
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.
Avatar billede martinhrj Nybegynder
27. januar 2005 - 15:16 #9
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 ;)
Avatar billede _carsten Nybegynder
27. januar 2005 - 15:27 #10
Okay - så er jeg på ideen, men prøv med doLayout/pack.

Tvivler bare på effekten.
Avatar billede martinhrj Nybegynder
27. januar 2005 - 15:41 #11
Du havde ret... det havde ingen effekt :(

Jeg må jo bare lave det selv, så.

Tak for hjælpen! Hvis jeg ikke havde lukket spørgsmålet før du svarede, havde du fået point (det er jo tanken der tæller :))
Avatar billede _carsten Nybegynder
27. januar 2005 - 16:30 #12
:)
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