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
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 :-)
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 :-)