Avatar billede stenmadsen Nybegynder
07. august 2002 - 15:02 Der er 5 kommentarer og
1 løsning

Problem med Book append metoden

Jeg har et problem med følgende kodefragment

    Book bk = new Book();
    bk.append(new PaintJTextArea(jta,font), pf,
    Book.UNKNOWN_NUMBER_OF_PAGES);

Da jeg ikke ved på forhånd hvor mange fysiske sider mit JTextArea vil fylde, forsøger jeg at bruge konstanten Book.UNKNOWN_NUMBER_OF_PAGES. Men append-metoden kaster
java.lang.ArrayIndexOutOfBoundsException
        at java.util.Vector.setSize(Vector.java:242)
        at java.awt.print.Book.append(Book.java:140)
        at PrintJTextArea.print(PrintJTextArea.java:65)
        at MyFrameWithPrinting2.<init>(MyFrameWithPrinting2.java:67)
        at MyFrameWithPrinting2.main(MyFrameWithPrinting2.java:77)

Min kode virker fint hvis jeg erstatter Book.UNKNOWN_NUMBER_OF_PAGES med f.eks. 1000. også selv om jeg kun printer 1 eller 2 sider ud.

Har jeg misforstået hvordan Book.UNKNOWN_NUMBER_OF_PAGES benyttes?
På forhånd tak
Sten
Avatar billede magoo20000 Nybegynder
07. august 2002 - 15:22 #1
På lige engang under append at skrive bk.getNumberOfPages() ud til f.eks. colsol..
Avatar billede stenmadsen Nybegynder
07. august 2002 - 15:55 #2
ændrer jeg til
bk.append(new PaintJTextArea(jta,font), pf);
System.out.println("bkPages="+bk.getNumberOfPages());
returnere bk.getNumberOfPages() 1

Ændrer jeg til
bk.append(new PaintJTextArea(jta,font), pf,7);
System.out.println("bkPages="+bk.getNumberOfPages());
returnere bk.getNumberOfPages() 7
og print metoden i PaintJTextArea objektet kaldes korrekt 2 x 7 gange.

Ændrer jeg til
bk.append(new PaintJTextArea(jta,font), pf, Book.UNKNOWN_NUMBER_OF_PAGES);
køres Konstrukteren i PaintJTextArea korrekt, herefter kastes
java.lang.ArrayIndexOutOfBoundsException.
print-metoden i PaintJTextArea kaldes ikke.
Avatar billede magoo20000 Nybegynder
07. august 2002 - 16:14 #3
Hmmm.. Ja Book implementerer interfacet Pageable og får derved attributten UNKNOWN_NUMBER_OF_PAGES.. Jeg kan desværre ikke helt forstå, hvad der er galt, men attributten bliver af en eller anden grund ikke sat..Skal da lige se efter om jeg ikke har noget kode a la det her til at ligge!
Avatar billede stenmadsen Nybegynder
07. august 2002 - 16:31 #4
Her har du min PaintJTextClass. Print metoden kalder en statisk metode PrintJTextArea.drawJTextArea i 'Hoved klassen' PrintJTextArea. Måske kan det give lidt mere information. Klassen PrintPageShift er blot en hjælpeklasse med 2 instance variable og tilhørende get- og set-metoder til at holde styr på sideskift.
Sten

class PaintJTextArea implements Printable {
  JTextArea jta;
  String[] lines;
  PrintPageShift pageShift = new PrintPageShift(0,0);
  boolean first = true;
  Font fnt = new Font("Times New Roman", Font.PLAIN, 8);
 
  public PaintJTextArea(JTextArea jta, Font font) {
    this.jta = jta;   
    if (font != null)
      fnt = font; 
    this.lines = jta.getText().split("\n");
  }   
 
  public int print(Graphics g, PageFormat pf, int pageIndex)
        throws PrinterException {
    g.setFont(fnt);
    g.setColor(Color.black);
    if (!first) {
      pageShift = PrintJTextArea.drawJTextArea((Graphics2D) g, lines, pageShift, pf);
      first = true;
    }
    else
      first = false; 
    if (pageShift.getPageShiftParagraph() < lines.length)
      return Printable.PAGE_EXISTS;
    else {
      return Printable.NO_SUCH_PAGE;
    } 
  }
}
Avatar billede stenmadsen Nybegynder
08. august 2002 - 10:14 #5
Jeg har lavet nogle få ændringer i min PrintJTextArea klasse så den benytter metoden setPrintable i stedet for setPageable. Nu er det ikke nødvendigt at angive antallet af fysiske sider. Printdialogboxen spørger så om jeg vil printe side 1-9999.
Avatar billede stenmadsen Nybegynder
08. august 2002 - 10:19 #6
Jeg vil gerne stadig benytte Book klassen, men  mangler en løsning på at tælle antallet af fysiske sider der skal printes, så denne parameter kan sættes korrekt når jeg kalder Book klassens append metode. Jeg opretter et nyt spørgsmål til denne problemstilling.
Sten
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

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation

Politiets Efterretningstjeneste

Configuration Manager til PET's IT-afdeling

Akademikernes A-kasse

AI Product Owner

Politiets Efterretningstjeneste

AI/ML udvikler i PET