Toon posts:

[JAVA] Layout regelen voor het Printen

Pagina: 1
Acties:
  • 349 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
dag mensen,

ik probeer gegevens te laten printen (op papier via printer....) die gebruikers via een
GUI hebben ingevoerd in bepaalde tekstvelden, ik heb het ff heel simpel aangepakt:

http://java.sun.com/products/java-media/2D/forDevelopers/sdk12print.html

gewoon het voorbeeldje " The Printable Interface " CTRL + v CTRL + c in mn progje.
alles dat ik heb veranderd is:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// in de Print klasse
private String mText = Runner.returnPrintText();

//in de runner
public static String returnPrintText(){
           String pText = ob.returnString();
           return pText;
       }

// in een klasse ob
public String returnString(){
       String nl = "\n";
       String s = textFields[2].getText() + nl + nl + textFields[3].getText() + nl;
       return s;
}



dit doet hij verder prima, met als enige probleem dat die new lines niet door komen, hij print
de gegevens (ik heb het hier maar even afgekort tot 2 gegevens) achter elkaar.
ik weet wel ongeveer waardoor het komt (ik dacht zelf door de linebreakmeasurer), maar ik weet niet wat ik er aan kan doen.

dus ff kort:
ik moet de gegevens onder elkaar krijgen ipv naast elkaar, iemand enig idee hoe?

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Misschien kun je "\r\n" proberen.
Dus mét carriage return.

Is maar een gokje hoor ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
ik had graag gehad dat het zó makkelijk op te lossen was :9 , maar helaas...
hij doet dat dus niet...

Verwijderd

Hey B,

als je
code:
1
String nl = "\n";


vervangt door
code:
1
String nl = "\r";

moet het volgens mij wel werken.

BTW, heb ff gegoogled op java output:

http://www.codeproject.com/useritems/javabasicsio.asp

hier staat dat je heel makkelijk
code:
1
System.out.println(TeTestenVariabele);


kan uitvoeren, om in het venster naast het debug venster (je run-venster, standaard linksonderin) te zien te krijgen wat de waarde van dat ding is, (met de \n en \r uitgevoerd als return carriage en newline)!

Veel succes, Juice
edit:
typo :-)

[ Voor 5% gewijzigd door Verwijderd op 24-04-2006 21:01 ]


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Dan zou "\r\n" ook moeten werken :)
En dat werkte niet ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

tsja, maar ik ken B, miss dat die een foutje heeft gemaakt met de dubbele quotes :-), gewoon ff voordoen werkt meestal het beste :-)

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op dinsdag 25 april 2006 @ 09:40:
tsja, maar ik ken B, miss dat die een foutje heeft gemaakt met de dubbele quotes :-), gewoon ff voordoen werkt meestal het beste :-)
*grijns*
Dan wordt het een scriptrequest, en da's verboden ;)

Java:
1
String nl = Character.toString(10);

zou ook een newline moeten geven, al is er geen verschil met die \n :)

Heb je misschien wat meer code waar je daadwerkelijk print? :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 25 april 2006 @ 09:40:
tsja, maar ik ken B, miss dat die een foutje heeft gemaakt met de dubbele quotes :-), gewoon ff voordoen werkt meestal het beste :-)
en bedankt juice...... :P , met alle respect, maar dat soort achtelijke fouten maak ik niet.....
Java is niet super nieuw meer voor me.....
Gonadan schreef op dinsdag 25 april 2006 @ 09:45:
*grijns*
Dan wordt het een scriptrequest, en da's verboden ;)
hier vraag ik dan ook niet om :), geeft mijzelf ook geen voldoening als iemand me het letterlijk voordoet.

iig, die

Java:
1
system.out.println(mStyledText);


doet het niet, geeft alleen het nummer van de styledtext weer, ook mStyledText.toString() doet ie niet. dat had ik natuurlijk al getest, en nogmaals, het probleem zit hem er niet in dat die \n niet meekomt.... dat doet ie namelijk wel

Java:
1
system.out.println(mText);


geeft aan dat de oorspronkelijke string in PrintText wel de enters heeft.

het probleem zit hem er dus in, dat (ik denk) de linebreakmeasurer die enters weer weghaalt.

misschien ben ik voorheen wat onduidelijk geweest :9 , hoop het nu wat opgehelderd te hebben,
nog een stukje code met de linebreakmeasurer:

Java:
1
2
3
4
5
6
7
8
9
10
11
Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIterator = mStyledText.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
float wrappingWidth = (float) format.getImageableWidth();


while (measurer.getPosition() < charIterator.getEndIndex()) {

TextLayout layout = measurer.nextLayout(wrappingWidth);
pen.y += layout.getAscent();
float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Wat doet "getEndIndex()" precies?
Slaat die niet gewoon de endlines over?

Ik heb geen ervaring met printen in java, maar kan je het niet makkelijker regel voor regel doen? :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
ehm ff tussendoor:
ik zit nou ergens anders en hier doet de printer het niet..... dus ik moet eerst ff
een manier zien te vinden waarmee ik kan zien wat ik print, voordat ik weer kan gaan
reageren,
srry

Verwijderd

Topicstarter
ik heb eens ff gegoogled maar volgens die sites (sun) zou
Java:
1
system.out.println(mStyledText.toString);  

het gewoon moeten doen.

heb geen id hoe het dan wel zou moeten doen, iemand?

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Vaak moet je een toString() methode zelf implementeren.
Net als clone() e.d.

Wat is die mStyledText voor een type object?

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
een attributedString, die gewoon de methode toString met zich meedraagt
dus zou hij dat dan toch gewoon moeten doen, of zit ik er naast?

ook dit doet het niet (vanzelf sprekend natuurlijk, aangezien de mStyledText.toString het ook
niet deed);

Java:
1
2
String s = mStyledText.toString();
system.out.println(s);

wat ik te zien krijg als output =

java.text.AttributedString@ab54eb
de waarde achter de @ verschilt elke keer

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op dinsdag 25 april 2006 @ 14:27:
een attributedString, die gewoon de methode toString met zich meedraagt
dus zou hij dat dan toch gewoon moeten doen, of zit ik er naast?

ook dit doet het niet (vanzelf sprekend natuurlijk, aangezien de mStyledText.toString het ook
niet deed);

Java:
1
2
String s = mStyledText.toString();
system.out.println(s);

wat ik te zien krijg als output =

java.text.AttributedString@ab54eb
de waarde achter de @ verschilt elke keer
Juist, dat betekend dat hij de geheugenwaarde laat zien omdat de toString() methode niet geimplementeerd is :)

Java:
1
2
3
4
5
AttributedCharacterIterator charIterator = mStyledText.getIterator();
for (int i = charIterator.getBeginIndex(); i < charIterator.getEndIndex(); i++) {
  charIterator.setIndex(i)
  System.out.print(charIterator.current);
}


Probeer zoiets eens :)

[ Voor 23% gewijzigd door Gonadan op 25-04-2006 14:51 ]

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
yups doet ie prima krijg de output mooi onder elkaar (alleen wel 2 keer)
waaruit dan dus weer volgt dat ik nog steeds denk dat het probleem em zit in de LineBreakMeasurer...
:)
maar aangezien ik nog steeds geen printer heb, moet ik dus nog steeds een methode zien te schrijven
die de uiteindelijke output weergeeft (dus na de LineBreakMeasurer), ben druk bezig maar kom nog niet echt verder.....

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Dan kan je daarmee een toString() methode schrijven voor je mStyledText.
Als dat lukt kan je hem toch aan de praat krijgen? :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
k, ik zit nou dus weer bij een printer en ik krijg het dus echt niet voor elkaar.....
de String komt wel goed mee naar de klasse PrintText, maar ergens daar wordt de
'enter' dus weggehaald :( , grrrr
maar goed, de hoop wordt niet opgegeven, men gaat vrolijk verder met het uitpluizen van dit probleem :)
als iemand tips heeft though, graag! :9

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Post de klasse PrintText eens?

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
okiedo, hier PrintText:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import com.sun.org.apache.bcel.internal.classfile.Attribute;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
import javax.print.attribute.AttributeSet;


public class PrintText implements Printable {

    private String mText = Runner.returnPrintText();
    private AttributedString mStyledText = new AttributedString(mText);


 public void printContsructor(){


System.out.println(mText);
PrinterJob printerJob = PrinterJob.getPrinterJob();

Book book = new Book();
book.append(new PrintText(), new PageFormat());

printerJob.setPageable(book);

boolean doPrint = printerJob.printDialog();
if (doPrint) {


try {

printerJob.print();

} catch (PrinterException exception) {

System.err.println("Printing error: " + exception);

}
}
}

public int print(Graphics g, PageFormat format, int pageIndex) {

Graphics2D g2d = (Graphics2D) g;


g2d.translate(format.getImageableX(), format.getImageableY());


g2d.setPaint(Color.black);

/* Use a LineBreakMeasurer instance to break our text into
 * lines that fit the imageable area of the page.
 */

Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIterator = mStyledText.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
float wrappingWidth = (float) format.getImageableWidth();

while (measurer.getPosition() < charIterator.getEndIndex()) {

    if (measurer.getPosition() == onthouder){
        measurer.insertChar(charIteratorAfterNL, onthouder);
    }
    
TextLayout layout = measurer.nextLayout(wrappingWidth);
pen.y += layout.getAscent();
float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());

layout.draw(g2d, pen.x + dx, pen.y);
pen.y += layout.getDescent() + layout.getLeading();

}
return Printable.PAGE_EXISTS;

}
}

Verwijderd

Topicstarter
ok mensen,
ik heb het voor elkaar. :*)


Java:
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIteratorAfterNL;
AttributedCharacterIterator charIterator = mStyledText.getIterator();

    float leftMargin = 20;
    float rightMargin = 410;
    
    int onthouder = 0;
     
     for (int x = 0; x < charIterator.getEndIndex(); x++){
         charIterator.setIndex(x);
         if (charIterator.current() == '\n'){
             onthouder ++;
         }
     }

     int[] newLineLocations = new int[onthouder + 1];

     int i = 0;
     for (char c = charIterator.first(); c != charIterator.DONE; c = charIterator.next()) {
         if (c == '\n') {
             newLineLocations[i] = charIterator.getIndex();
             i++;
         }
     }
     newLineLocations[onthouder] = charIterator.getEndIndex() - 1;

     
     LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator,g2d.getFontRenderContext());
     int currentNewLine = 0;
     float verticalPos = 20;
     
     
     while (measurer.getPosition() < charIterator.getEndIndex()) {

         // lineContainsText is true after first segment is drawn
         boolean lineContainsText = false;
         boolean lineComplete = false;
         float maxAscent = 0, maxDescent = 0;
         float horizontalPos = leftMargin;
         Vector layouts = new Vector(1);
         Vector penPositions = new Vector(1);

         while (!lineComplete) {
             float wrappingWidth = rightMargin - horizontalPos;
             TextLayout layout =
                     measurer.nextLayout(wrappingWidth, newLineLocations[currentNewLine] + 1, lineContainsText);

             // layout can be null if lineContainsText is true
             if (layout != null) {
                 layouts.addElement(layout);
                 penPositions.addElement(new Float(horizontalPos));
                 horizontalPos += layout.getAdvance();
                 maxAscent = Math.max(maxAscent, layout.getAscent());
                 maxDescent = Math.max(maxDescent,
                     layout.getDescent() + layout.getLeading());
             } else {
                 lineComplete = true;
             }

             lineContainsText = true;

             if (currentNewLine <= onthouder){
             
             if (measurer.getPosition() == newLineLocations[currentNewLine]+1) {
                 lineComplete = true;
             }
             }
             
             if (measurer.getPosition() == newLineLocations[currentNewLine]+1) {
                 currentNewLine ++;
             }

             if (measurer.getPosition() == charIterator.getEndIndex())
                 lineComplete = true;
             
             else if (horizontalPos >= 30)
                 lineComplete = true;
             
         }

         verticalPos += maxAscent;

         Enumeration layoutEnum = layouts.elements();
         Enumeration positionEnum = penPositions.elements();

         
         while (layoutEnum.hasMoreElements()) {
             TextLayout nextLayout = (TextLayout) layoutEnum.nextElement();
             Float nextPosition = (Float) positionEnum.nextElement();
             nextLayout.draw(g2d, nextPosition.floatValue(), verticalPos);
         }

         verticalPos += maxDescent;
     }
 
 
 
return Printable.PAGE_EXISTS;

}
}

met heel veel dank aan deze site:
Sun site over LineBreakMeasurer
er zitten vast nog wel wat foutjes in hier en daar, maar voorals nog werkt ie, ik ben nu nog bezig met de start positie van het printen goed te krijgen, tegen de tijd dat ik dat goed heb, laat ik het wel weer weten.
dank voor de hulp, en tips zijn nog steeds welkom :)

[edit]
de code werkt nu goed, als iemand ooit wilt printen: de '\n' wordt gelezen de '\t' niet.
alles wat je hoeft te doen is de String mText te vervangen door de te printen text.
(en de code tot regel 57 uit mn vorige post erbij gooien natuurlijk :P .....)
succes dr mee :)

[ Voor 41% gewijzigd door Verwijderd op 27-04-2006 09:59 . Reden: uiteindelijk versie :P ]


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Weet je nou ook wat heb probleem was of heb je copy/paste gedaan? ;)

Ik ben namelijk wel benieuwd naar het probleem voor het geval ik later ook met java ga printen :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Baron
  • Registratie: Juli 2000
  • Laatst online: 30-01 15:04
Voor het geval je later met Java gaat printen. Bekijk een keertje JasperReports. Heel handig om rapporten te printen.

Verwijderd

Topicstarter
Die LineBreakMeasurer zorgt er voor, dat lange regels automatisch opgesplitst worden in meerdere regels, zodat er geen gegevens wegvallen (dat ze als het ware naast het papier worden geprint).
Het probleem hierbij is dat de LineBreakMeasurer de dingen die wel naast elkaar passen ook naast elkaar gezet, ongeacht 'tabs' of 'enters', dus wat ik nu heb gedaan zorgt ervoor dat de printer na het tegenkomen van de character "\n" (of (char)10 ), een regel omlaag verder gaat met printen,
dat is ff kort uitgelegt wat deze methode doet. :9 maar als je in de toekomst gaat printen met java hoop ik toch echt voor je dat je een makkelijkere manier vindt, want dit is maar klote :)

[ Voor 4% gewijzigd door Verwijderd op 26-04-2006 13:40 ]


Verwijderd

tip: bedenk net dat je ipv naar een stuk papier, ook naar een bestand kan printen (bijvoorbeeld met cutepdf of adobepdf), want Keesch had verteld dat hij erg veel had moeten printen om tot de fout-conclusie te kunnen komen.

Dus, tip, schrijf je output naar een bestand, niet naar papier!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:47

Gonadan

Admin Beeld & Geluid, Harde Waren
Ik kan me trouwens niet voorstellen dat je zoveel code nodig hebt om wat tekst te printen. :|

Of ik onderschat de complexiteit van printen in java natuurlijk :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
ja dat dacht ik dus ook :)......
maar volgens mij is dit de enige manier |:( (wanneer je het helemaal zelf uitschrijft tenminste).
ik zal binnekort mijn laatste reply met de code updaten, zitten hier en daar nog wat foutjes :9.
degene die straks willen printen, hoeven dan alleen maar de String mText te veranderen.

[edit]
gedaan....
Verwijderd schreef op woensdag 26 april 2006 @ 23:49:
tip: bedenk net dat je ipv naar een stuk papier, ook naar een bestand kan printen (bijvoorbeeld met cutepdf of adobepdf), want Keesch had verteld dat hij erg veel had moeten printen om tot de fout-conclusie te kunnen komen.

Dus, tip, schrijf je output naar een bestand, niet naar papier!
heb het progje geprobeerd (is gewoon freeware, ff googlelen), en het is inderdaad erg handig :*)
en scheelt weer heel wat bomen, en daarmee zuurstof B) :P

[ Voor 50% gewijzigd door Verwijderd op 27-04-2006 10:01 ]

Pagina: 1