raptor666
21.03.2003, 11:46
hi,
ich hab ein kleines Problem beim Drucken von Text. Waere super wenn mir da jemand
weiterhelfen koennte (derjenige muss nicht unbeding 'Jemand' heissen ;)
Die Application aus der ich drucken will hat eine JTextArea, deren Text und Titel
in einem Object (myObject) gespeichert wird. Um beim Drucken verschiedene Schrift-
arten zur Verfuegung zu haben schreibe ich das ganze nicht in einen Stream sondern
nutze die Object.paint() methode.
Das ganze funktioniert soweit eingentlich. Ein Problem besteht jedoch darin, dass
Zeilen die zu lange sind nicht umgebrochen werden, sondern nur soweit gedruckt
werden wie moeglich, der rest wird weggelassen. Das koennte man sicher loesen, indem
man den (Zeilen-)String mittels der Leerzeichen in Token aufteilt und maximal moegliche
Anzahl von Token (ueber die FontMetrics) in eine Zeile schreibt und den Rest des
Strings in die naechste(n) Zeile(n). Das erscheint mir aber relativ umstaendlich,
und ich koennte mir vorstellen, dass es da eine einfachere Moeglichkeit gibt. Hab aber
leider nichts gefunden.
Das zweite Problem ist wenn der zu druckende Text eine Seite ueberschreitet. Kann mir
jemand sagen wie ich den Text auf mehrere Druckseiten aufteile??
// Aufruf des PrintJobs im ActionHandler
try {
PrinterJob pjob = PrinterJob.getPrinterJob();
PageFormat pf = pjob.defaultPage();
pjob.setJobName(myObject.toString());
pjob.setCopies(1);
// myObject wird an PrinterPage uebergeben
final PrinterPage thing = new PrinterPage(myObject,
pf.getWidth(), pf.getHeight(), pf.getImageableX(),
pf.getImageableY(), txtFont);
pjob.setPrintable(new Printable() {
public int print(Graphics pg, PageFormat pf, int pageNum) {
if (pageNum > 0)
return Printable.NO_SUCH_PAGE;
thing.paint(pg);
return Printable.PAGE_EXISTS;
}
});
if (pjob.printDialog() == false)
return;
pjob.print();
} catch(PrinterException ep) {
}
// PrinterPage Object dessen paint() methode dann gedruckt wird
public class PrinterPage extends Component {
private MyObject myObject = new MyObject();
private Font pageFont = new Font("Dialog",Font.PLAIN,12);
private int pageWidth = 0;
private int pageHight = 0;
private int pageImgX = 0;
private int pageImgY = 0;
public PrinterPage(MyObject myObject, double pageWidth, double pageHight, double pageImgX,
double pageImgY,Font pageFont) {
this.myObject = myObject;
this.pageFont = pageFont;
this.pageWidth = new Double(pageWidth).intValue();
this.pageHight = new Double(pageHight).intValue();
this.pageImgX = new Double(pageImgX).intValue();
this.pageImgY = new Double(pageImgY).intValue();
}
public void paint(Graphics g) {
int sPosY = pageImgY + 20;
g.drawString("<< " + myObject.getTitle() + " >>",pageImgX,pageImgY);
g.drawLine(pageImgX, pageImgY + 10, pageWidth - pageImgX, pageImgY + 10);
g.drawLine(pageImgX, pageHight - pageImgY,
pageWidth - pageImgX, pageHight - pageImgY);
g.setFont(new Font("Dialog",Font.PLAIN,8));
FontMetrics fm = g.getFontMetrics();
int fHight = fm.getHeight();
// Mehrzeiligen String in einzelne Zeilen auftrennen und zeichnen
String txtString = myObject.getText();
StringTokenizer st = new StringTokenizer(txtString, "\n\r");
while (st.hasMoreTokens()) {
sPosY = sPosY + fHight;
String s = st.nextToken();
g.drawString(s,pageImgX,sPosY);
}
}
public Dimension getPreferredSize() {
return new Dimension(pageWidth,pageHight);
}
}
thx schon mal fuer eure Hilfe
gr33tz
ich hab ein kleines Problem beim Drucken von Text. Waere super wenn mir da jemand
weiterhelfen koennte (derjenige muss nicht unbeding 'Jemand' heissen ;)
Die Application aus der ich drucken will hat eine JTextArea, deren Text und Titel
in einem Object (myObject) gespeichert wird. Um beim Drucken verschiedene Schrift-
arten zur Verfuegung zu haben schreibe ich das ganze nicht in einen Stream sondern
nutze die Object.paint() methode.
Das ganze funktioniert soweit eingentlich. Ein Problem besteht jedoch darin, dass
Zeilen die zu lange sind nicht umgebrochen werden, sondern nur soweit gedruckt
werden wie moeglich, der rest wird weggelassen. Das koennte man sicher loesen, indem
man den (Zeilen-)String mittels der Leerzeichen in Token aufteilt und maximal moegliche
Anzahl von Token (ueber die FontMetrics) in eine Zeile schreibt und den Rest des
Strings in die naechste(n) Zeile(n). Das erscheint mir aber relativ umstaendlich,
und ich koennte mir vorstellen, dass es da eine einfachere Moeglichkeit gibt. Hab aber
leider nichts gefunden.
Das zweite Problem ist wenn der zu druckende Text eine Seite ueberschreitet. Kann mir
jemand sagen wie ich den Text auf mehrere Druckseiten aufteile??
// Aufruf des PrintJobs im ActionHandler
try {
PrinterJob pjob = PrinterJob.getPrinterJob();
PageFormat pf = pjob.defaultPage();
pjob.setJobName(myObject.toString());
pjob.setCopies(1);
// myObject wird an PrinterPage uebergeben
final PrinterPage thing = new PrinterPage(myObject,
pf.getWidth(), pf.getHeight(), pf.getImageableX(),
pf.getImageableY(), txtFont);
pjob.setPrintable(new Printable() {
public int print(Graphics pg, PageFormat pf, int pageNum) {
if (pageNum > 0)
return Printable.NO_SUCH_PAGE;
thing.paint(pg);
return Printable.PAGE_EXISTS;
}
});
if (pjob.printDialog() == false)
return;
pjob.print();
} catch(PrinterException ep) {
}
// PrinterPage Object dessen paint() methode dann gedruckt wird
public class PrinterPage extends Component {
private MyObject myObject = new MyObject();
private Font pageFont = new Font("Dialog",Font.PLAIN,12);
private int pageWidth = 0;
private int pageHight = 0;
private int pageImgX = 0;
private int pageImgY = 0;
public PrinterPage(MyObject myObject, double pageWidth, double pageHight, double pageImgX,
double pageImgY,Font pageFont) {
this.myObject = myObject;
this.pageFont = pageFont;
this.pageWidth = new Double(pageWidth).intValue();
this.pageHight = new Double(pageHight).intValue();
this.pageImgX = new Double(pageImgX).intValue();
this.pageImgY = new Double(pageImgY).intValue();
}
public void paint(Graphics g) {
int sPosY = pageImgY + 20;
g.drawString("<< " + myObject.getTitle() + " >>",pageImgX,pageImgY);
g.drawLine(pageImgX, pageImgY + 10, pageWidth - pageImgX, pageImgY + 10);
g.drawLine(pageImgX, pageHight - pageImgY,
pageWidth - pageImgX, pageHight - pageImgY);
g.setFont(new Font("Dialog",Font.PLAIN,8));
FontMetrics fm = g.getFontMetrics();
int fHight = fm.getHeight();
// Mehrzeiligen String in einzelne Zeilen auftrennen und zeichnen
String txtString = myObject.getText();
StringTokenizer st = new StringTokenizer(txtString, "\n\r");
while (st.hasMoreTokens()) {
sPosY = sPosY + fHight;
String s = st.nextToken();
g.drawString(s,pageImgX,sPosY);
}
}
public Dimension getPreferredSize() {
return new Dimension(pageWidth,pageHight);
}
}
thx schon mal fuer eure Hilfe
gr33tz