Avatar billede Slettet bruger
21. august 2003 - 18:36 Der er 10 kommentarer og
1 løsning

Java AWT Print - det er godt nok IKKE nemt - det driller

Hejsa Eksperter....

Jeg er ved at lave en lille test til mig selv, hvor jeg prøver at udskrive en log..... men....den gør ikke som jeg vil have den til at gøre..... i får lige min kode....:

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.util.*;

public class PrintableLog implements Printable
{    public static final String PAGE_TITLE = "p2pFileMover Log";

    private int numberOfPages;
    private LinkedList logMessages;
   
    private int pageWidth, pageHeight;
    private FontMetrics fm;
   
    public PrintableLog(LinkedList logMessages, int numberOfPages)
    {    this.numberOfPages = numberOfPages;
        // Only print logmessages up to "print"-action has performed - ergo....clone!!!!
        this.logMessages = (LinkedList)logMessages.clone();
    }
    public int print(Graphics pg, PageFormat pf, int pageIndex) throws PrinterException
    {    if (pageIndex >= numberOfPages)
            return NO_SUCH_PAGE;
       
        pg.translate((int)pf.getImageableX(), (int)pf.getImageableY());
       
        if (pf.getOrientation() == pf.PORTRAIT)
        {    pageWidth = (int)pf.getImageableWidth();
            pageHeight = (int)pf.getImageableHeight();
        }
        else
        {    pageWidth = (int)(pf.getImageableWidth()+(pf.getImageableWidth()/2));
            pageHeight = (int)(pf.getImageableHeight()+(pf.getImageableHeight()/2));
            pg.setClip(0, 0, pageWidth, pageHeight);
        }
       
        int y = 0; // Y-position (Vertikal...up/down...pos of Graphics written)
        int x = 0; // X-position (Horizontal...left/right,,, pos of Graphics written)
       
        // Writes Title
        pg.setFont(new Font("Dialog",Font.BOLD, 20));
        pg.setColor(Color.BLACK);
        fm = pg.getFontMetrics();
       
        y += fm.getAscent();
        pg.drawString(PAGE_TITLE, x, y);
        pg.drawLine(x, y+2, pageWidth, y+2);
       
        y += fm.getHeight(); // Makes "Title" distance to log-prints....
       
        // Prints actual log
        pg.setFont(new Font("Dialog",Font.BOLD, 11));
        fm = pg.getFontMetrics();
       
        // TEST "PRINT OUT".... since the while-loop will produce SQUAT....damn
        pg.drawString("Her er noget tekst på linien efter TITLEN", x, y);
        y += fm.getHeight();
        pg.drawString("Her er noget tekst på linien efter linien efter TITLEN", x, y);
        y += fm.getHeight();
        pg.drawString("Her er noget tekst på linien efter linien efter linien efter TITLEN", x, y);
        y += fm.getHeight();
       
        Graphics2D g2 = (Graphics2D)pg;
        FontRenderContext frc = g2.getFontRenderContext();
        Rectangle2D fontBounds = null;

        while (!logMessages.isEmpty() && y < pageHeight)
        {    System.out.println ("In the while...");
           
            LogMessage theMsg = (LogMessage)logMessages.removeFirst();
           
            // Draw type of action
            fontBounds = pg.getFont().getStringBounds(theMsg.getType(), frc);
            pg.setColor(theMsg.getColor());
            pg.drawString(theMsg.getType(), x, y);
            pg.drawLine(x, y, pageWidth, y);
           
            x = x + (int)fontBounds.getWidth() + 5;
           
            // Draw the message
            fontBounds = pg.getFont().getStringBounds(theMsg.getMsgToDisplay(), frc);
            pg.setColor(Color.BLACK);
            pg.setFont(new Font("Dialog",Font.PLAIN, 11));
            pg.drawString(theMsg.getMsgToDisplay(), x, y);
           
            x = x + (int)fontBounds.getWidth() + 5;
           
            // Draw time
            fontBounds = pg.getFont().getStringBounds(theMsg.getTime(), frc);
            pg.setFont(new Font("Dialog",Font.ITALIC, 11));
            pg.drawString(theMsg.getTime(), x, y);
           
            x = 0;
            y += fontBounds.getHeight()+2;
        }
        return PAGE_EXISTS;
    }
}

.... problem er det, at den godt nok printer alt hvad er defineret i print(..., ..., ...)-metoden indtil den kommer til while-løkken. Jeg har testet (vha. system.out.println.....fy-ha-skamme-skamme) at den kommer ind i løkken, men alligevel producerer pg.drawString(..., ..., ...) ikke noget output på papiret....

Det skal siges at jeg er godt desperat nu..... please HELP ME.......jeg er bare så "lost".....
Avatar billede _carsten Nybegynder
21. august 2003 - 19:09 #1
Har du også prøvet denne i løkken:

System.out.println (theMsg.getMsgToDisplay(), x, y);

Umiddelbart tror jeg at theMsg.getMsgToDisplay() ikke returnerer nogen tekst
Avatar billede Slettet bruger
21. august 2003 - 19:12 #2
Jow.... det gør den.... jeg har System.out.println-testet alle værdier som bruges i løkken (der ligger i LogMessage-objekter).... Det er ikke det som er problemet....

Kom glad igen :-)
Avatar billede _carsten Nybegynder
21. august 2003 - 19:25 #3
Prøv lige at fjerne den her:    x = x + (int)fontBounds.getWidth() + 5;

For mig at se, må du tegne til højre for papiret.
Avatar billede Slettet bruger
21. august 2003 - 19:33 #4
Nope _carsten, det var heller ikke det... (har lige testet)

Du skal også lige tænke på at alt hvad der sker i een iteration i while-løkken er det at skrive een linie.... Hver gang en "x = x + (......." forekommer flyttes x-koordinaten blot 5 pixels efter hvad der lige er blevet skrevet, og i slutningen af løkken flyttes x-koordinates til 0 således at der kan skrives en ny linie i den næste iteration......

Kom glad igen :-)
Avatar billede _carsten Nybegynder
21. august 2003 - 20:06 #5
I mine øjne kan der kun blive udskrevet noget på papir.

Jeg går ud fra, at du har checket værdien af 'x', mig bekendt
måler getStringBounds() omfanget af en tekst, så hvis teksten
som returneres fra theMsg.getType() ikke er lang og fontfarven
ellers ikke er hvid, så skal det bare virke.

Så 1. Check x's værdi
  2. Brug ikke usynlig blæk

:-) :-) :-)

Glad igen
Avatar billede Slettet bruger
21. august 2003 - 20:25 #6
Jeg er MEGA forvirret.... jeg har nu tjekket x's værdi, og jeg skriver faktisk også KUN med sort nu....

....det virker ikke......

Jeg har så, i et desperat forsøg - forsøgt at indsætte det følgende i bunden af min løkke:

pg.setColor(Color.BLACK);
pg.drawString("BOOOOO", pageWidth/2, pageHeight/2);

Så burde den jo udskrive "BOOOOO" (+/- et eller to O'er) midt på papiret (sådan næsten da.......) ..... MEN DET GØR DEN HELLER IKKE......arghhhhh :-(

Derfor føler jeg mig nu nødsat til at hæve pointene til 200 for at et endnu større geni end _carsten (no offense) kommer løbende til :-(

Og jeg kan se at den løber løkken igennem det antal gange svarende til antal poster jeg har i min LinkedList...... gah .... ?!?
Avatar billede _carsten Nybegynder
21. august 2003 - 21:32 #7
Jeg er altså ked af at side det, men dine metoder theMsg.getMsgToDisplay(),
theMsg.getType() og theMsg.getTime() returnerer IKKE noget som kan
udskrives !

Jeg har testet din kode hos mig selv med få ændringer og den
skriver PERFEKT hos mig - SORT PÅ HVIDT PAPIR!

Her har du ændringerne.


        int sss = 0;
        while (sss < 10 && y < pageHeight)
        {    System.out.println ("In the while...");
           
           
            // Draw type of action
            fontBounds = pg.getFont().getStringBounds("KKK", frc);
            pg.setColor(Color.BLACK);
            pg.drawString("KKK", x, y);
            pg.drawLine(x, y, pageWidth, y);
           
            x = x + (int)fontBounds.getWidth() + 5;
           
            // Draw the message
            fontBounds = pg.getFont().getStringBounds("KKK", frc);
            pg.setColor(Color.BLACK);
            pg.setFont(new Font("Dialog",Font.PLAIN, 11));
            pg.drawString("KKK", x, y);
           
            x = x + (int)fontBounds.getWidth() + 5;
           
            // Draw time
            fontBounds = pg.getFont().getStringBounds("KKK", frc);
            pg.setFont(new Font("Dialog",Font.ITALIC, 11));
            pg.drawString("KKK", x, y);


            sss++;
            x = 0;
            y += fontBounds.getHeight()+2;
        }
Avatar billede _carsten Nybegynder
24. august 2003 - 12:19 #8
Er du kommet videre ??

Har du tænkt på at dine metoder, som etc. theMsg.getMsgToDisplay() MÅSKE returnerer objecter - prøv at binde en toString() efter dem.
Avatar billede _carsten Nybegynder
27. august 2003 - 22:00 #9
Er du stadig ked af det ???
Avatar billede _carsten Nybegynder
28. august 2003 - 21:02 #10
Hvis du har løst opgaven og mener 200 points noget i overkantet,
så fyr et "passende" antal points af og luk spørgsmålets!

Jeg har ingen problemer med at acceptere den løsning,
din printkode er jo OK !!
Avatar billede Slettet bruger
08. september 2003 - 10:01 #11
Sorry...... Jeg havde FULDSTÆNDIGT glemt at jeg havde et åbent spørgsmål, sorry! Du får dine point nu......
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

IT-JOB

Csis Security Group A/S

Junior Software Engineer

Unik System Design A/S

DevOps Engineer

Forsikrings- og pensionsakademiet A/S

IT-teknisk profil