Avatar billede Slettet bruger
10. marts 2004 - 14:30 Der er 5 kommentarer og
1 løsning

Problemer med udskrift, PageFormat.setOrientation(int)

Hejsa eksperter,

Jeg er ved at lave en udskriftsfunktionalitet, MEN jeg har problemer (ikke personlige, men programudviklingsmæssigt, hehehe).

Jeg kan sagtens få java til at udskrive på et stykke papir, når jeg bruger metoden setOrientation(Printable.PORTRAIT) - men det går galt når jeg vil udskrive i LANDSCAPE....

Jeg kalder metoden setOrientation(Printable.LANSCAPE), og så vender Java da også udskriften på papiret, men den udskrive kun i en bredde som var papiret PORTRAIT-bredde ?!?!...

Jeg er ved at være meget forvirret... Håber i kender til en løsning på problemet
Avatar billede arne_v Ekspert
10. marts 2004 - 16:53 #1
Har du prøvet at kalde getPaper og se hvad Java tror formatet er ?
Avatar billede Slettet bruger
10. marts 2004 - 17:08 #2
Jeg tror faktisk problemet ligger andetsteds end i print(..., ..., ...)-metoden, eftersom jeg lige fik fat i den samme fejl når jeg udskrev til et JPanel.... Vil du være sød at tjekke det for mig, her er klasserne der skal bruges for at teste:

PrintAndDrawable.class

package presentation.general;

import java.awt.*;
import java.awt.print.Printable;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import java.util.LinkedList;

/**
* Abstract base-class for images which should be drawable on paper, as well
* as on any Component (or other Graphical interface).
*/
public abstract class PrintAndDrawable implements Printable {
    public static final int PORTRAIT = 0;
    public static final int LANDSCAPE = 1;

    private static final int WIDE = 1754; // Proportional correct to A4-dimensions
    private static final int NARROW = 1240; // Proportional correct to A4-dimensions

    protected Dimension dim;
    protected LinkedList images;

    /**
    * Constructor only reachable through super(int type) from implementing subclass
    * @param type must be PrintAndDrawable.PORTRAIT or PrintAndDrawable.LANDSCAPE
    */
    public PrintAndDrawable(int type) {
        images = new LinkedList();
        dim = type == PORTRAIT ? new Dimension(NARROW, WIDE) : new Dimension(WIDE, NARROW);
    }

    /**
    * This method has to be implemented,
    *
    * <b>Desired behavioure of this method:</b>
    * When this method is invoked, all graphics should be generated. Images generated should then be put in
    * the list <code>images</code>.
    */
    public abstract void generateGraphics();

    /**
    * Retrieves an image from linkedlist at specified index
    * @param index of Image in list
    * @return Image from list at specified index
    */
    public Image getImage(int index) {
        return (Image)images.get(index);
    }

    /**
    * Return all images in list in a array (of Image-objects)
    * @return
    */
    public Image[] getImages() {
        return (Image[])images.toArray(new Image[images.size()]);
    }

    /**
    * Number of images generated by the <code>generateGraphics()</code> method
    * @return number of images in list images.
    */
    public int size() {
        return images.size();
    }

    /**
    * @return width of Images in list
    */
    public double getWidth() {
        return dim.getWidth();
    }

    /**
    * @return height of Images in list
    */
    public double getHeight() {
        return dim.getHeight();
    }

    /**
    * Print image to printer (Native call, results may vary...
    *
    * @param g the Graphics-object to draw the output upon
    * @param pageFormat holds information about page-dimension, orientation etc.
    * @param pageIndex the index of the page, 0 being the first, 1 the second etc.
    * @return Printable.NO_SUCH_PAGE if pageIndex wasn't valid, Printable.PAGE_EXITS otherwise
    * @throws PrinterException if something went wrong (since we're accessing an external (to JVM) resource.
    */
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
        if (pageIndex > 0)
            return Printable.NO_SUCH_PAGE;

        //pageFormat.setOrientation(PageFormat.PORTRAIT);
        int x = (int)pageFormat.getImageableX();
        int y = (int)pageFormat.getImageableY();
        int width = (int)pageFormat.getWidth()-x;
        int height = (int)pageFormat.getHeight()-y;

        System.out.println("x: "+x+" y: "+y+" width: "+width+" height: "+height);

        g.setFont(new Font("Dialog", Font.PLAIN, 11));
        g.setColor(Color.black);
        g.drawString("This is a test text string", x+100, y+100);
        g.drawLine(x, y, width, y); // TOP line
        g.drawLine(x, height, width, height); // BOTTOM line
        g.drawLine(x, y, x, height); // WEST line
        g.drawLine(width, y, width, height); // EAST line

        //Graphics2D g2d = (Graphics2D)g;
        //g2d.rotate(Math.toRadians(90), 0, 0);
        //g.drawImage(hierarchi, x, y, width, height, null);

        return Printable.PAGE_EXISTS;
    }
}


samt ResultListWeightClass:

package presentation.general;

import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.util.LinkedList;

/**
* Class responsible for generating a list (report) of Result of clubs in weightclasses
*/
public class ResultListWeightClass extends PrintAndDrawable {
    private LinkedList fights;

    /**
    * <b>Default Constructor</b>
    *
    * @param fights a list of Fight-objects to generate the tree-hierarchi representation from
    */
    public ResultListWeightClass(LinkedList fights) {
        super(PrintAndDrawable.LANDSCAPE);
        this.fights = fights;

        generateGraphics();
    }

    // todo: has to be fully implemented !!!
    public void generateGraphics() {
        BufferedImage toPaintUpon  = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);

        Graphics g = toPaintUpon.getGraphics();
        Graphics2D g2d = (Graphics2D)g;

        g.setColor(Color.black);

        // Draw box around margin
        g.drawLine(0, 0, (int)getWidth(), 0);
        g.drawLine(0, 0, 0, (int)getHeight());
        g.drawLine(0, (int)getHeight(), (int)getWidth(), (int)getHeight());
        g.drawLine((int)getWidth(), 0, (int)getWidth(), (int)getHeight());

        g.setFont(new Font("dialog", Font.BOLD, 10));
        g.drawString("Side 1", ((int)getWidth()-getWidthOfText("Side 1", g, g2d)-10), 12);
        g.setFont(new Font("dialog", Font.BOLD, 40));
        g.drawString("Resultat liste", getXForCenteredText("Resultat liste", g, g2d), 50);
        g.drawLine(0, 55, (int)getWidth(), 55);

        // Add image to list
        images.add(toPaintUpon);
    }

    private int getWidthOfText(String text, Graphics g, Graphics2D g2d) {
        FontRenderContext frc = g2d.getFontRenderContext();
        Rectangle2D fontBounds = g.getFont().getStringBounds(text, frc);
        return (int)fontBounds.getWidth();
    }
    private int getXForCenteredText(String text, Graphics g, Graphics2D g2d) {
        int width = getWidthOfText(text, g, g2d);
        return (int)((getWidth()-width)/2);
    }
}

Nu kan jeg nemlig kun få udskrevet hele komponentens bredde hvis den er initialiseret med LANDSCAPE i konstruktoren..... Derfor må der jo være noget i vejen med mit BufferedImage?

Se i hvert fald lige på det, når fejlen både manifesterer sig når man udskriver til komponent såvel som printer, er den ikke printerspecifik :-)
Avatar billede _carsten Nybegynder
10. marts 2004 - 19:47 #3
Har skimmet din kode og et hurtigt skud fra hoften, var at du prøvede denne

g.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());

Indskydes her i din print metode
    System.out.println("x: "+x+" y: "+y+" width: "+width+" height: "+height);
    g.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());
    g.setFont(new Font("Dialog", Font.PLAIN, 11));

Det skal siges, at jeg ikke er sikker i sagen!
Avatar billede Slettet bruger
10. marts 2004 - 19:50 #4
Tjah, men jeg tror ikke det er der det er galt, for den burde jo vise hele billedet når jeg viser billedet i en JLabel. Jeg har også prøvet med translate, og det er ikke det som er galt
Avatar billede arne_v Ekspert
10. marts 2004 - 20:06 #5
Jeg er bange for at jeg må melde pas - det er uden for mit ekspertise område
Avatar billede Slettet bruger
12. marts 2004 - 13:57 #6
Jeg fandt selv en løsning, skulle blot sætte clip (forums.java.sun.com er din ven når du søger med de rigtige ord, hehehe)

// translates origin to top left corner of imageable area
g.translate((int)pageFormat.getImageableX(),(int)pageFormat.getImageableY());

// sets the clip size to the imageable area size
g.setClip(0, 0, (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());

Lukker her, tak for hjælpen alligevel vel, dog :-)
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