JScrollPane drucken

Loki2

Erfahrenes Mitglied
Hallo,

ich habe schon im Forum gesucht und ein paar Beispiele ausprobiert aber keines wollte so richtig funktionieren :confused:

Ich versuche ein JScrollPane zu drucken. Im Prinzip funktionieren die Beispiele die ich hier im Forum gefunden habe allerdings wird das alles immer auf eine Seite zusammengestaucht und sieht dann dementsprechend mies aus.
Wie kann ich das verhindern, bzw. wie kann ich den ScrollPane in voller länge ausdrucken?

Hoffe ihr könnt mir helfen.

Gruß und so
Loki2
 
Hallo Loki,

also mein Ansatz wäre, das ScrollPane Schrittweise capturen und die jeweiligen Bilder dann einzeln ausdrucken.

Ich werd versuchen heut abend oder morgen ein Beispiel zu schreiben.


Vg Erdal
 
Hallo Loki,

beim Drucken einer JScrollPane wird nur der Sichtbare Teil ausgegeben. Daher ist es besser, den Inhalt des JScrollPanes auszudrucken. Hier in deinem Fall ist das ein JPanel mit vielen weiteren Komponenten.

Das nächste Problem ist, was mache ich wenn der Inhalt des JScrollPane auf eine DinA4 Seite nicht passt. Mein Ansatz ist, das ich diesen zuschneide und jeweils die Teile je auf eine Seite drucke. Das JPanel im JScrollPane das ich in meinem Beispiel verwendet habe ist sowohl von der breite als auch von der länge her größer als eine DinA4 Seite. Dieser wird infolgedessen sowohl horizontal als auch vertikal zugeschnitten und ausgedruckt. Das sieht aber dann nicht mehr so gut aus. Ich würde insofern empfehlen das die Breite des Inhaltes der JScrollPane nicht über die Breite eines DinA4 Blatts herausragt.

Auch gibt dir dieses Beispiel die Möglichkeit, zunächst das zu druckende als Bilder abzuspeichern - oberer Button saveall.


Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class Print_JPanel_Example extends JFrame implements Printable,
		ActionListener {

	// GUI //

	private JButton button1 = new JButton("Save All");

	private JButton button2 = new JButton("Print All");

	private JPanel panelToPrint = new JPanel();

	private JScrollPane scrollPane = new JScrollPane(panelToPrint);

	// ScreenShot //
	private BufferedImage bImage;

	private List<BufferedImage> bImageList;

	private PageFormat pf = new PageFormat();

	private PrinterJob printerJob = PrinterJob.getPrinterJob();

	private static final int CONS = 2;

	// Constructor //
	public Print_JPanel_Example(String s, char c) {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(800, 800);
		this.setLocationByPlatform(true);
		this.setAlwaysOnTop(true);

		button1.addActionListener(this);
		button2.addActionListener(this);
		button1.setBackground(Color.MAGENTA);
		button2.setBackground(Color.MAGENTA);

		this.createContentOfScrollPane();

		this.add(button1, BorderLayout.NORTH);
		this.add(scrollPane, BorderLayout.CENTER);
		this.add(button2, BorderLayout.SOUTH);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new Print_JPanel_Example("http://www.faz.de", 'u');
	}

	public void actionPerformed(ActionEvent e) {
		bImageList = new ArrayList<BufferedImage>();
		bImage = new BufferedImage(panelToPrint.getWidth(), panelToPrint
				.getHeight(), BufferedImage.TYPE_INT_BGR);

		panelToPrint.paint(bImage.getGraphics());

		int wT = bImage.getWidth();
		int hT = bImage.getHeight();

		int w = (int) pf.getImageableWidth() * CONS;
		int h = (int) pf.getImageableHeight() * CONS;

		int x = (int) (wT / w);
		int y = (int) (hT / h);

		for (int i = 0; i <= x; i++) {
			for (int j = 0; j <= y; j++) {
				if (i == x && j == y)
					bImageList.add(bImage.getSubimage(i * w, j * h, wT - x * w,
							hT - y * h));
				else if (i == x)
					bImageList.add(bImage.getSubimage(i * w, j * h, wT - x * w,
							h));
				else if (j == y)
					bImageList.add(bImage.getSubimage(i * w, j * h, w, hT - y
							* h));
				else
					bImageList.add(bImage.getSubimage(i * w, j * h, w, h));
			}
		}

		if (e.getActionCommand().equals("Print All"))
			printAll();
		else
			saveAll();
	}

	public void saveAll() {
		for (int i = 0; i < bImageList.size(); i++) {
			try {
				ImageIO.write(bImageList.get(i), "JPEG", new File("page" + i
						+ ".jpg"));
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}

	public boolean printAll() {
		printerJob.setPrintable(this, pf);
		try {
			printerJob.print();
		} catch (PrinterException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	public int print(Graphics g, PageFormat pFormat, int pageIndex)
			throws PrinterException {

		int page = 0;

		Graphics2D g2 = (Graphics2D) g;

		g2.translate((int) pFormat.getImageableX(), (int) pFormat
				.getImageableY());
		g2.scale(1.0 / CONS, 1.0 / CONS);

		g2.drawImage(bImageList.get(page), 0, 0, this);

		page++;

		return page > bImageList.size() ? Printable.PAGE_EXISTS
				: Printable.NO_SUCH_PAGE;
	}

	public void createContentOfScrollPane() {
		JPanel p1 = new JPanel();
		p1.add(new JButton("Button1"));
		p1.add(new JButton("Button2"));
		p1.add(new JButton("Button3"));

		JPanel p2 = new JPanel(new BorderLayout());
		p2.add(new JButton("North"), BorderLayout.NORTH);
		p2.add(new JButton("South"), BorderLayout.SOUTH);
		p2.add(new JButton("East"), BorderLayout.EAST);
		p2.add(new JButton("West"), BorderLayout.WEST);
		p2.add(new JButton("Center"), BorderLayout.CENTER);

		JPanel p3 = new JPanel(new GridLayout(5, 1));
		p3.add(new JTextField());
		p3.add(new JTextField());
		p3.add(new JTextField());
		p3.add(new JTextField());
		p3.add(new JTextField());

		JPanel p4 = new JPanel(new GridLayout(5, 1));
		p4.add(new JLabel("          Label1          "));
		p4.add(new JLabel("          Label2          "));
		p4.add(new JLabel("          Label3          "));
		p4.add(new JLabel("          Label4          "));
		p4.add(new JLabel("          Label5          "));

		JTextArea ta = new JTextArea(faust);
		ta.setFont(new Font("Arial", Font.BOLD, 16));
		ta.setLineWrap(true);

		panelToPrint.setLayout(new BoxLayout(panelToPrint, BoxLayout.Y_AXIS));
		panelToPrint.add(p1);

		panelToPrint.add(ta);
		panelToPrint.add(p2);
		panelToPrint.add(p3);
		panelToPrint.add(new JColoredTable());
		panelToPrint.add(p4);
	}

	class JColoredTable extends JTable {
		public JColoredTable() {
			this.setModel(new QuadratTableModelSimple());
		}

		public Component prepareRenderer(TableCellRenderer renderer,
				int rowIndex, int vColIndex) {

			Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
			if (c instanceof JComponent) {
				JLabel jl = (JLabel) c;

				if (vColIndex % 2 == 0) {
					jl.setBackground(Color.YELLOW);
					jl.setAlignmentX(JLabel.RIGHT_ALIGNMENT);
					jl.setHorizontalAlignment(JLabel.CENTER);
				} else {
					jl.setBackground(Color.PINK);
					jl.setHorizontalAlignment(JLabel.RIGHT);
				}
			}
			return c;
		}
	}

	class QuadratTableModelSimple extends AbstractTableModel {
		public int getRowCount() {
			return 30;
		}

		public int getColumnCount() {
			return 20;
		}

		public Object getValueAt(int row, int col) {
			return new BigInteger("" + row).pow(col);
		}

		public String getColumnName(int column) {
			return "Spalte" + column;
		}
	}

	private static final String faust = "Habe nun, ach! Philosophie,"
			+ "Juristerei und Medizin,\n" + "Und leider auch Theologie\n"
			+ "Durchaus studiert, mit heißem Bemühn.\n"
			+ "Da steh ich nun, ich armer Tor!\n"
			+ "Und bin so klug als wie zuvor;\n"
			+ "Heiße Magister, heiße Doktor gar\n"
			+ "Und ziehe schon an die zehen Jahr\n"
			+ "Herauf, herab und quer und krumm\n"
			+ "Meine Schüler an der Nase herum-\n"
			+ "Und sehe, daß wir nichts wissen können!\n"
			+ "Das will mir schier das Herz verbrennen.\n"
			+ "Zwar bin ich gescheiter als all die Laffen,\n"
			+ "Doktoren, Magister, Schreiber und Pfaffen;\n"
			+ "Mich plagen keine Skrupel noch Zweifel,\n"
			+ "Fürchte mich weder vor Hölle noch Teufel-\n"
			+ "Dafür ist mir auch alle Freud entrissen,\n"
			+ "Bilde mir nicht ein, was Rechts zu wissen,\n"
			+ "Bilde mir nicht ein, ich könnte was lehren,\n"
			+ "Die Menschen zu bessern und zu bekehren.\n"
			+ "Auch hab ich weder Gut noch Geld,\n"
			+ "Noch Ehr und Herrlichkeit der Welt;\n"
			+ "Es möchte kein Hund so länger leben!\n"
			+ "Drum hab ich mich der Magie ergeben,\n"
			+ "Ob mir durch Geistes Kraft und Mund\n"
			+ "Nicht manch Geheimnis würde kund;\n"
			+ "Daß ich nicht mehr mit saurem Schweiß\n"
			+ "Zu sagen brauche, was ich nicht weiß;\n"
			+ "Daß ich erkenne, was die Welt\n"
			+ "Im Innersten zusammenhält,\n"
			+ "Schau alle Wirkenskraft und Samen,\n"
			+ "Und tu nicht mehr in Worten kramen.\n\n"
			+ "O sähst du, voller Mondenschein,\n"
			+ "Zum letzenmal auf meine Pein,\n"
			+ "Den ich so manche Mitternacht\n"
			+ "An diesem Pult herangewacht:\n"
			+ "Dann über Büchern und Papier,\n"
			+ "Trübsel'ger Freund, erschienst du mir!\n"
			+ "Ach! könnt ich doch auf Bergeshöhn\n"
			+ "In deinem lieben Lichte gehn,\n"
			+ "Um Bergeshöhle mit Geistern schweben,\n"
			+ "Auf Wiesen in deinem Dämmer weben,\n"
			+ "Von allem Wissensqualm entladen,\n"
			+ "In deinem Tau gesund mich baden!";
}


Vg Erdal
 
Hi Erdal,

erstmal vielen Dank für Deine Mühe und Deine Antworten.

Leider bekomme ich Dein Beispiel nicht zum drucken. Windows meldet zwar das das Dokument zum Drucker gesendet wurde aber beim Drucker kommt trotzdem nichts an. Der reagiert nicht einmal. Woran kann das liegen? Was ist falsch? Ich habe auch schon verschiedene Drucker ausprobiert und nirgends wird gedruckt :confused:

Hoffe Du kannst mir noch weiterhelfen.

Vielen Dank.

Gruß und so
Loki2
 
Hallo Loki,

stimmt! Bei mir hat es auch nicht funktioniert. Das war ein modifizierter alter Code. Hab mich darauf verlassen, da das speichern der Screenshots funktioniert hat.

Hab den Code verbessert, jetzt funktioniert es. Natürlich ist die Qualität nicht perfekt. Aber fürs erste ists OK. Die Feinarbeit überlass jedoch ich dir.

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class Print_JPanel_Example extends JFrame implements Printable,
		ActionListener {

	// GUI //

	private JButton button1 = new JButton("Save All");

	private JButton button2 = new JButton("Print All");

	private JPanel panelToPrint = new JPanel();

	private JScrollPane scrollPane = new JScrollPane(panelToPrint);

	// ScreenShot //
	private BufferedImage bImage;

	private List<BufferedImage> bImageList;

	// - //
	private PageFormat pf = new PageFormat();

	private PrinterJob printerJob = PrinterJob.getPrinterJob();

	private static final int CONS = 2;

	private int numberOfPages = 0;

	// Constructor //
	public Print_JPanel_Example() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(800, 800);
		this.setLocationByPlatform(true);
		this.setAlwaysOnTop(true);

		button1.addActionListener(this);
		button2.addActionListener(this);
		button1.setBackground(Color.MAGENTA);
		button2.setBackground(Color.MAGENTA);

		this.createContentOfScrollPane();

		this.add(button1, BorderLayout.NORTH);
		this.add(scrollPane, BorderLayout.CENTER);
		this.add(button2, BorderLayout.SOUTH);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new Print_JPanel_Example();
	}

	public void actionPerformed(ActionEvent e) {
		bImageList = new ArrayList<BufferedImage>();
		bImage = new BufferedImage(panelToPrint.getWidth(), panelToPrint
				.getHeight(), BufferedImage.TYPE_INT_BGR);

		panelToPrint.paint(bImage.getGraphics());

		int wT = bImage.getWidth();
		int hT = bImage.getHeight();

		int w = (int) pf.getImageableWidth() * CONS;
		int h = (int) pf.getImageableHeight() * CONS;

		int x = (int) (wT / w);
		int y = (int) (hT / h);

		for (int i = 0; i <= x; i++) {
			for (int j = 0; j <= y; j++) {
				if (i == x && j == y)
					bImageList.add(bImage.getSubimage(i * w, j * h, wT - x * w,
							hT - y * h));
				else if (i == x)
					bImageList.add(bImage.getSubimage(i * w, j * h, wT - x * w,
							h));
				else if (j == y)
					bImageList.add(bImage.getSubimage(i * w, j * h, w, hT - y
							* h));
				else
					bImageList.add(bImage.getSubimage(i * w, j * h, w, h));
			}
		}

		numberOfPages = bImageList.size();

		if (e.getActionCommand().equals("Print All"))
			printAll();
		else
			saveAll();
	}

	public void saveAll() {
		for (int i = 0; i < numberOfPages; i++) {
			try {
				ImageIO.write(bImageList.get(i), "JPEG", new File("page" + i
						+ ".jpg"));
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}

	public void printAll() {
		for (int i = 0; i < numberOfPages; i++)
			printPage(i);
	}

	public boolean printPage(int page) {
		if (page < 0 || page > numberOfPages - 1)
			return false;
		printerJob.setPrintable(this, pf);
		bImage = bImageList.get(page);
		try {
			printerJob.print();
		} catch (PrinterException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	public int print(Graphics g, PageFormat pFormat, int pageIndex)
			throws PrinterException {
		if (pageIndex > 0)
			return Printable.NO_SUCH_PAGE;

		Graphics2D g2 = (Graphics2D) g;

		g2.translate((int) pFormat.getImageableX(), (int) pFormat
				.getImageableY());
		g2.scale(1.0 / CONS, 1.0 / CONS);

		g2.drawImage(bImage, 0, 0, null);
		g2.dispose();

		return Printable.PAGE_EXISTS;
	}

	public void createContentOfScrollPane() {
		JPanel p1 = new JPanel();
		p1.add(new JButton("Button1"));
		p1.add(new JButton("Button2"));
		p1.add(new JButton("Button3"));

		JPanel p2 = new JPanel(new BorderLayout());
		p2.add(new JButton("North"), BorderLayout.NORTH);
		p2.add(new JButton("South"), BorderLayout.SOUTH);
		p2.add(new JButton("East"), BorderLayout.EAST);
		p2.add(new JButton("West"), BorderLayout.WEST);
		p2.add(new JButton("Center"), BorderLayout.CENTER);

		JPanel p3 = new JPanel(new GridLayout(5, 1));
		p3.add(new JTextField());
		p3.add(new JTextField());
		p3.add(new JTextField());
		p3.add(new JTextField());
		p3.add(new JTextField());

		JPanel p4 = new JPanel(new GridLayout(5, 1));
		p4.add(new JLabel("          Label1          "));
		p4.add(new JLabel("          Label2          "));
		p4.add(new JLabel("          Label3          "));
		p4.add(new JLabel("          Label4          "));
		p4.add(new JLabel("          Label5          "));

		JTextArea ta = new JTextArea(faust);
		ta.setFont(new Font("Arial", Font.BOLD, 16));
		ta.setLineWrap(true);

		panelToPrint.setLayout(new BoxLayout(panelToPrint, BoxLayout.Y_AXIS));
		panelToPrint.add(p1);

		panelToPrint.add(ta);
		panelToPrint.add(p2);
		panelToPrint.add(p3);
		panelToPrint.add(new JColoredTable());
		panelToPrint.add(p4);
	}

	class JColoredTable extends JTable {
		public JColoredTable() {
			this.setModel(new QuadratTableModelSimple());
		}

		public Component prepareRenderer(TableCellRenderer renderer,
				int rowIndex, int vColIndex) {

			Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
			if (c instanceof JComponent) {
				JLabel jl = (JLabel) c;

				if (vColIndex % 2 == 0) {
					jl.setBackground(Color.YELLOW);
					jl.setAlignmentX(JLabel.RIGHT_ALIGNMENT);
					jl.setHorizontalAlignment(JLabel.CENTER);
				} else {
					jl.setBackground(Color.PINK);
					jl.setHorizontalAlignment(JLabel.RIGHT);
				}
			}
			return c;
		}
	}

	class QuadratTableModelSimple extends AbstractTableModel {
		public int getRowCount() {
			return 30;
		}

		public int getColumnCount() {
			return 20;
		}

		public Object getValueAt(int row, int col) {
			return new BigInteger("" + row).pow(col);
		}

		public String getColumnName(int column) {
			return "Spalte" + column;
		}
	}

	private static final String faust = "Habe nun, ach! Philosophie,"
			+ "Juristerei und Medizin,\n" + "Und leider auch Theologie\n"
			+ "Durchaus studiert, mit heißem Bemühn.\n"
			+ "Da steh ich nun, ich armer Tor!\n"
			+ "Und bin so klug als wie zuvor;\n"
			+ "Heiße Magister, heiße Doktor gar\n"
			+ "Und ziehe schon an die zehen Jahr\n"
			+ "Herauf, herab und quer und krumm\n"
			+ "Meine Schüler an der Nase herum-\n"
			+ "Und sehe, daß wir nichts wissen können!\n"
			+ "Das will mir schier das Herz verbrennen.\n"
			+ "Zwar bin ich gescheiter als all die Laffen,\n"
			+ "Doktoren, Magister, Schreiber und Pfaffen;\n"
			+ "Mich plagen keine Skrupel noch Zweifel,\n"
			+ "Fürchte mich weder vor Hölle noch Teufel-\n"
			+ "Dafür ist mir auch alle Freud entrissen,\n"
			+ "Bilde mir nicht ein, was Rechts zu wissen,\n"
			+ "Bilde mir nicht ein, ich könnte was lehren,\n"
			+ "Die Menschen zu bessern und zu bekehren.\n"
			+ "Auch hab ich weder Gut noch Geld,\n"
			+ "Noch Ehr und Herrlichkeit der Welt;\n"
			+ "Es möchte kein Hund so länger leben!\n"
			+ "Drum hab ich mich der Magie ergeben,\n"
			+ "Ob mir durch Geistes Kraft und Mund\n"
			+ "Nicht manch Geheimnis würde kund;\n"
			+ "Daß ich nicht mehr mit saurem Schweiß\n"
			+ "Zu sagen brauche, was ich nicht weiß;\n"
			+ "Daß ich erkenne, was die Welt\n"
			+ "Im Innersten zusammenhält,\n"
			+ "Schau alle Wirkenskraft und Samen,\n"
			+ "Und tu nicht mehr in Worten kramen.\n\n"
			+ "O sähst du, voller Mondenschein,\n"
			+ "Zum letzenmal auf meine Pein,\n"
			+ "Den ich so manche Mitternacht\n"
			+ "An diesem Pult herangewacht:\n"
			+ "Dann über Büchern und Papier,\n"
			+ "Trübsel'ger Freund, erschienst du mir!\n"
			+ "Ach! könnt ich doch auf Bergeshöhn\n"
			+ "In deinem lieben Lichte gehn,\n"
			+ "Um Bergeshöhle mit Geistern schweben,\n"
			+ "Auf Wiesen in deinem Dämmer weben,\n"
			+ "Von allem Wissensqualm entladen,\n"
			+ "In deinem Tau gesund mich baden!";
}


Vg Erdal
 
Hallo Erdal,

jetzt klappt es! Prima! Vielen Dank dafür

Schönen Tag noch und vor allem einen schönen freien Tag morgen.

Gruß und so
Loki2
 
Hallo,

gibt es für
Code:
private List<BufferedImage> bImageList;
auch eine andere Möglichkeit also eine die mit Java 1.4 kompatibel ist?

Gruß und so
Loki2
 
Zurück