Noch ungelöst ! Klasse JTable und Klasse Drucken verknüpfen.

Status
Nicht offen für weitere Antworten.

spidermobile

Bekanntes Mitglied
Hallo,

ich habe mir in diesem Forum mal eine Klasse zum Drucken von JTable rausgesucht. Dann hab ich mir mal eine Beispielklasse (Aus dem Buch coreJava2) für eine JTable genommen.

Nun mein Problem. :oops:

Wie bekomme ich die Druckklasse in die JTable Klasse implementiert, dass als Ergebnis ein Blatt Papier ausgedruckt wird. Die Stelle ist mal egal, mir würde es reichen, wenn ich sehe wir diese z.B. in Main implementier wird.

Anbei poste ich mal die 2 Klassen.


Code:
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.DefaultCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.JScrollPane;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.*;
import java.awt.event.*;

public class TableRendererDemo extends JFrame {
	private boolean DEBUG = true;

	public TableRendererDemo() {
		super("TableRenderDemo");

		MyTableModel myModel = new MyTableModel();
		JTable table = new JTable(myModel);
		table.setPreferredScrollableViewportSize(new Dimension(500, 70));

		//Create the scroll pane and add the table to it. 
		JScrollPane scrollPane = new JScrollPane(table);

		//Set up column sizes.
		initColumnSizes(table, myModel);

		//Fiddle with the Sport column's cell editors/renderers.
		setUpSportColumn(table.getColumnModel().getColumn(2));

		//Add the scroll pane to this window.
		getContentPane().add(scrollPane, BorderLayout.CENTER);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	/*
	 * This method picks good column sizes.
	 * If all column heads are wider than the column's cells' 
	 * contents, then you can just use column.sizeWidthToFit().
	 */
	private void initColumnSizes(JTable table, MyTableModel model) {
		TableColumn column = null;
		Component comp = null;
		int headerWidth = 0;
		int cellWidth = 0;
		Object[] longValues = model.longValues;

		for (int i = 0; i < 5; i++) {
			column = table.getColumnModel().getColumn(i);

			try {
				comp = column.getHeaderRenderer().
								 getTableCellRendererComponent(
									 null, column.getHeaderValue(), 
									 false, false, 0, 0);
				headerWidth = comp.getPreferredSize().width;
			} catch (NullPointerException e) {
				System.err.println("Null pointer exception!");
				System.err.println("  getHeaderRenderer returns null in 1.3.");
				System.err.println("  The replacement is getDefaultRenderer.");
			}

			comp = table.getDefaultRenderer(model.getColumnClass(i)).
							 getTableCellRendererComponent(
								 table, longValues[i],
								 false, false, 0, i);
			cellWidth = comp.getPreferredSize().width;

			if (DEBUG) {
				System.out.println("Initializing width of column "
								   + i + ". "
								   + "headerWidth = " + headerWidth
								   + "; cellWidth = " + cellWidth);
			}

			//XXX: Before Swing 1.1 Beta 2, use setMinWidth instead.
			column.setPreferredWidth(Math.max(headerWidth, cellWidth));
		}
	} 

	public void setUpSportColumn(TableColumn sportColumn) {
		//Set up the editor for the sport cells.
		JComboBox comboBox = new JComboBox();
		comboBox.addItem("Snowboarding");
		comboBox.addItem("Rowing");
		comboBox.addItem("Chasing toddlers");
		comboBox.addItem("Speed reading");
		comboBox.addItem("Teaching high school");
		comboBox.addItem("None");
		sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

		//Set up tool tips for the sport cells.
		DefaultTableCellRenderer renderer =
				new DefaultTableCellRenderer();
		renderer.setToolTipText("Click for combo box");
		sportColumn.setCellRenderer(renderer);

		//Set up tool tip for the sport column header.
		TableCellRenderer headerRenderer = sportColumn.getHeaderRenderer();
		if (headerRenderer instanceof DefaultTableCellRenderer) {
			((DefaultTableCellRenderer)headerRenderer).setToolTipText(
					 "Click the sport to see a list of choices");
		} 
	}

	class MyTableModel extends AbstractTableModel {
		final String[] columnNames = {"First Name", 
									  "Last Name",
									  "Sport",
									  "# of Years",
									  "Vegetarian"};
		final Object[][] data = {
			{"Mary", "Campione", 
			 "Snowboarding", new Integer(5), new Boolean(false)},
			{"Alison", "Huml", 
			 "Rowing", new Integer(3), new Boolean(true)},
			{"Kathy", "Walrath",
			 "Chasing toddlers", new Integer(2), new Boolean(false)},
			{"Mark", "Andrews",
			 "Speed reading", new Integer(20), new Boolean(true)},
			{"Angela", "Lih",
			 "Teaching high school", new Integer(4), new Boolean(false)}
		};
		public final Object[] longValues = {"Angela", "Andrews", 
											"Teaching high school",
											new Integer(20), Boolean.TRUE};

		public int getColumnCount() {
			return columnNames.length;
		}
        
		public int getRowCount() {
			return data.length;
		}

		public String getColumnName(int col) {
			return columnNames[col];
		}

		public Object getValueAt(int row, int col) {
			return data[row][col];
		}

		/*
		 * JTable uses this method to determine the default renderer/
		 * editor for each cell.  If we didn't implement this method,
		 * then the last column would contain text ("true"/"false"),
		 * rather than a check box.
		 */
		public Class getColumnClass(int c) {
			return getValueAt(0, c).getClass();
		}

		/*
		 * Don't need to implement this method unless your table's
		 * editable.
		 */
		public boolean isCellEditable(int row, int col) {
			//Note that the data/cell address is constant,
			//no matter where the cell appears onscreen.
			if (col < 2) { 
				return false;
			} else {
				return true;
			}
		}

		/*
		 * Don't need to implement this method unless your table's
		 * data can change.
		 */
		public void setValueAt(Object value, int row, int col) {
			if (DEBUG) {
				System.out.println("Setting value at " + row + "," + col
								   + " to " + value
								   + " (an instance of " 
								   + value.getClass() + ")");
			}

			if (data[0][col] instanceof Integer
					&& !(value instanceof Integer)) {
				//With JFC/Swing 1.1 and JDK 1.2, we need to create
				//an Integer from the value; otherwise, the column
				//switches to contain Strings.  Starting with v 1.3,
				//the table automatically converts value to an Integer,
				//so you only need the code in the 'else' part of this
				//'if' block.
				try {
					data[row][col] = new Integer(value.toString());
					fireTableCellUpdated(row, col);
				} catch (NumberFormatException e) {
					JOptionPane.showMessageDialog(TableRendererDemo.this,
						"The \"" + getColumnName(col)
						+ "\" column accepts only integer values.");
				}
			} else {
				data[row][col] = value;
				fireTableCellUpdated(row, col);
			}

			if (DEBUG) {
				System.out.println("New value of data:");
				printDebugData();
			}
		}

		private void printDebugData() {
			int numRows = getRowCount();
			int numCols = getColumnCount();

			for (int i=0; i < numRows; i++) {
				System.out.print("    row " + i + ":");
				for (int j=0; j < numCols; j++) {
					System.out.print("  " + data[i][j]);
				}
				System.out.println();
			}
			System.out.println("--------------------------");
		}
	}

	public static void main(String[] args) {
		TableRendererDemo frame = new TableRendererDemo();
		frame.pack();
		frame.setVisible(true);
	}
}

Und die Klasse, die sich um den Ausdruck kümmert:

Code:
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.print.PageFormat; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 

import javax.swing.JTable; 

public class JtableDrucken implements Printable { 

	private JTable tabelle; 

	public JtableDrucken(JTable tabelle) { 
		this.tabelle = tabelle; 
	} 

	public int print(Graphics g, PageFormat pageFormat, int seitenIndex) throws PrinterException { 
		Graphics2D g2 = (Graphics2D) g; 
		g2.setColor(Color.black); 
		int fontHeight = g2.getFontMetrics().getHeight(); 
		int fontDesent = g2.getFontMetrics().getDescent(); 

		//Platz für die Seitenzahl lassen 
		double pageHeight = pageFormat.getImageableHeight() - fontHeight; 
		double pageWidth = pageFormat.getImageableWidth(); 
		double tableWidth = tabelle.getColumnModel().getTotalColumnWidth(); 
		double scale = 1; 
		if (tableWidth >= pageWidth) { 
			scale = pageWidth / tableWidth; 
		} 

		double headerHeightOnPage = tabelle.getTableHeader().getHeight() * scale; 
		double tableWidthOnPage = tableWidth * scale; 

		double oneRowHeight = (tabelle.getRowHeight() + tabelle.getRowMargin()) * scale; 
		int numRowsOnAPage = (int) ((pageHeight - headerHeightOnPage) / oneRowHeight); 
		double pageHeightForTable = oneRowHeight * numRowsOnAPage; 
		int totalNumPages = (int) Math.ceil(((double) tabelle.getRowCount()) / numRowsOnAPage); 
		if (seitenIndex >= totalNumPages) { 
			return NO_SUCH_PAGE; 
		} 

		g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
		g2.drawString("Seite: " + (seitenIndex + 1), (int) pageWidth / 2 - 35, (int) (pageHeight + fontHeight - fontDesent)); 

		g2.translate(0f, headerHeightOnPage); 
		g2.translate(0f, -seitenIndex * pageHeightForTable); 

		if (seitenIndex + 1 == totalNumPages) { 
			int lastRowPrinted = numRowsOnAPage * seitenIndex; 
			int numRowsLeft = tabelle.getRowCount() - lastRowPrinted; 
			g2.setClip(0, (int) (pageHeightForTable * seitenIndex), (int) Math.ceil(tableWidthOnPage), (int) Math.ceil(oneRowHeight * numRowsLeft)); 
		} else { 
			g2.setClip(0, (int) (pageHeightForTable * seitenIndex), (int) Math.ceil(tableWidthOnPage), (int) Math.ceil(pageHeightForTable)); 
		} 

		g2.scale(scale, scale); 
		tabelle.paint(g2); 
		g2.scale(1 / scale, 1 / scale); 
		g2.translate(0f, seitenIndex * pageHeightForTable); 
		g2.translate(0f, -headerHeightOnPage); 
		g2.setClip(0, 0, (int) Math.ceil(tableWidthOnPage), (int) Math.ceil(headerHeightOnPage)); 
		g2.scale(scale, scale); 
		tabelle.getTableHeader().paint(g2); 

		return Printable.PAGE_EXISTS; 
	} 

}
 
B

bygones

Gast
mach deine Tabelle z.B. als Instanzvariable.
Wenn gedruckt werden soll erstellst du dir JTableDrucken Element mit deiner Tabelle:
Code:
JTableDrucken jtd = new JTableDrucken(myTable);
Das übergibst du dann an den drucker....
 
G

Guest

Gast
Hi deathbyaclown,

danke für die Antwort.

Um die Methode print muss ich mich gar nicht kümmern?

Ich dachte, dass ich explizit diese Methode ansprechen muss und hatte mit den Übergabeparametern so meine Probleme.

Grüße
 
B

bygones

Gast
naja "an den drucker weitergeben" impliziert dann das print an den drucker schicken....

ich weiß leider nicht genau den ganzen Schlonz bzgl drucken, aber meines wissen bekommt die print methode ja ein Printable als paramter - das wäre dann deine JTableDrucken Klasse
 

spidermobile

Bekanntes Mitglied
Hi deathbyaclown,

das funktionier leidser so nicht. Ich kann zwar die Klasse instanzieren aber es passiert nichts. Ich bin mir sicher, dass ich die print Methode ansprechen muss. Wobe ich wieder bei meinem Problem bin.

Code:
jtd.print(table, ?????, 0);

Ich weiss einfach nicht was "PageFormat pageFormat" für einen Übergabeparameter haben will.
 

spidermobile

Bekanntes Mitglied
Schade, dass sich niemand findert, der dieses Problem lösen kann.

So wie ich das sehr gibt es sehr viele Suchende, dies sich mit dem Thema "Drucken" auseinandersetzen.

Daher denke ich, dass eine Lösung von großem Interesse sein wird!

Darum, please HELP :cry:
 

Freakazoid

Mitglied
ja ,da hast du recht,ich hab da auch so meine Probleme mit java und drucken....
ich hab mal so ein bissl rumprobiert(ohne gewähr auf richtigkeit!)
ich denk das du das Grahphics-object im Konstruktor mit table.getGraphics() erhälst,
gibt zumindest keine Fehler bei mir....
ich zeig dir mal wie es bei mir aussieht,allerdings druckt der auch noch nix,aber vielleicht kommt dir ja ne weitere idee....ich kann zumindest ohne fehler die print methode afrufen....

Code:
JTableDrucken tab = new JTableDrucken(table);
PrinterJob pjob =PrinterJob.getPrinterJob();
pjob.printDialog();
PageFormat defaultPF = pjob.defaultPage();

try
{
       tab.print(table.getGraphics(),defaultPF,1);
}
catch(Exception ex){}

P.S.mein drucker ist schrott,ich kanns auch nicht wirklich probieren.....
 
G

Guest

Gast
Hi,
leider hat sich bisher für dieses Problem keine Lösung gefunden :cry:
 

Freakazoid

Mitglied
try this....


Code:
        		JTableDrucken tab = new JTableDrucken(table);
        		PrinterJob pjob =PrinterJob.getPrinterJob();
        		pjob.setPrintable(tab);
        		pjob.setCopies(1);
        		pjob.setJobName("Auswertung");

        		if(pjob.printDialog())
        		{
        			pjob.getCopies();
        			try
        			{
          				pjob.print();
        			} 		
        			catch (Exception ex)
        			{      }
        		}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
F Hat es noch einen Sinn, alte Versionen zu lernen Java Basics - Anfänger-Themen 45
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
S Ist das noch Insertionsort? Java Basics - Anfänger-Themen 3
O Warum will die MEthode noch am Ende einr eturn Java Basics - Anfänger-Themen 10
Arita welche Fehler gibt es noch? wie kann ich es noch vervollständigen Java Basics - Anfänger-Themen 15
T Methode schreiben, die einem Array ein Stringelement hinzufügt, wenn dieses noch nicht enthalten ist. Java Basics - Anfänger-Themen 6
CptK Vererbung Attributtyp in Super-Klasse noch nicht festlegen Java Basics - Anfänger-Themen 1
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
marcooooo einmal noch schnell hilfe bitte:/ Java Basics - Anfänger-Themen 2
M In gleicher zeile hinter ausgabe noch etwas ausgeben Java Basics - Anfänger-Themen 1
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
V_Fynn03 Erste Schritte BubbleSort Quelltext funktioniert noch nicht Java Basics - Anfänger-Themen 1
J Zweck von Interfaces immer noch nicht klar Java Basics - Anfänger-Themen 3
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
P Cäsear verschlüsselung irgendwas passt noch nicht Java Basics - Anfänger-Themen 2
B java.util.Date noch zeitgemäß? Java Basics - Anfänger-Themen 6
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
S Noch eine Frage zur Rekursion... Java Basics - Anfänger-Themen 11
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
M Variable noch erstellen oder lieber so? Java Basics - Anfänger-Themen 1
V Bin eigentlich noch VOR dem Anfang .... Java Basics - Anfänger-Themen 9
T Anzeige, wie lange es noch dauert bis ein File gesendet ist. Java Basics - Anfänger-Themen 2
A Wie kann ich mein Programm noch effizienter machen? Java Basics - Anfänger-Themen 1
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Noch immer Probleme mit exec Java Basics - Anfänger-Themen 15
H Geht dieser Code noch einfacher (try catch finally) Java Basics - Anfänger-Themen 7
P Geht dieser Code noch einfacher? Java Basics - Anfänger-Themen 16
I fertige xml-datein in eine noch aufzubauende xml-datei einfügen Java Basics - Anfänger-Themen 4
M Java von kopf bis Fuß noch zeitgemäß ? Java Basics - Anfänger-Themen 18
S noch ein ArrayIndexOutOfBoundsException Fehler Java Basics - Anfänger-Themen 2
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
S Musik einfügen funktioniert noch nicht Java Basics - Anfänger-Themen 6
P Noch zum Thema Arrays Java Basics - Anfänger-Themen 13
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
O Noch einmal Methoden Java Basics - Anfänger-Themen 9
T socket.close aber verbindung besteht noch Java Basics - Anfänger-Themen 4
C Threads Auffindung noch laufender Programmteile Java Basics - Anfänger-Themen 2
M Weder Consolenausgabe noch Fehlermeldung! Java Basics - Anfänger-Themen 5
E Prüfen, ob entfernte JVM noch aktiv ist? Java Basics - Anfänger-Themen 5
S ArrayList nur ergänzen wenn Element noch nicht vorhanden Java Basics - Anfänger-Themen 4
J Wie java programm noch schneller machen? Java Basics - Anfänger-Themen 30
C Umsteiger hat noch ein paar Fragen Java Basics - Anfänger-Themen 11
M immer noch usedelimiter Java Basics - Anfänger-Themen 4
M file löschen, streams evtl noch offen Java Basics - Anfänger-Themen 7
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
K Bestehenden Chat modifizieren (noch ein Anfänger!) Java Basics - Anfänger-Themen 7
C Hilfe!!! Ich werd noch wahnsinnig... Java Basics - Anfänger-Themen 3
I Module und Testumgebung noch nicht verstanden... Java Basics - Anfänger-Themen 6
G Weder IE noch Firefox zeigen mir Java Applets an Java Basics - Anfänger-Themen 5
K Scrollpane - versteh nur noch Fragezeichen Java Basics - Anfänger-Themen 6
K Alle noch nicht umgedrehte Karten umdrehen ? Java Basics - Anfänger-Themen 2
S @ override + noch was Java Basics - Anfänger-Themen 3
D Kann noch fast nichts, funktioniert auch fast nichts! Java Basics - Anfänger-Themen 8
K Hier noch ein Konstruktor aufbauen Java Basics - Anfänger-Themen 6
G Threads prüfen, ob diese noch laufen. Java Basics - Anfänger-Themen 3
S Wie runden man noch mal auf bestimmte stellen? Java Basics - Anfänger-Themen 8
N Ich habs immer noch nicht hinbekommen :( Java Basics - Anfänger-Themen 3
D noch ein kleines Problem Java Basics - Anfänger-Themen 4
M OOP und ich - irgendwie verträgt sich das noch nicht. Java Basics - Anfänger-Themen 6
F jbutton and noch was^^ Java Basics - Anfänger-Themen 15
R Noch ein paar Anfängerfragen. Java Basics - Anfänger-Themen 4
R Noch eine Frage: Breite des Applets im Browser ermitteln Java Basics - Anfänger-Themen 7
G Array-Länge bei Erzeugung noch unbekannt - wie erzeugen? Java Basics - Anfänger-Themen 12
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
P Textdateischreiben, etwas fehlt noch bzw. 1 error kommt Java Basics - Anfänger-Themen 4
L Noch immer Threat-Problem Java Basics - Anfänger-Themen 8
J referenz auf noch nicht erzeugte objekte? Java Basics - Anfänger-Themen 2
J Noch ein Parser Problem Java Basics - Anfänger-Themen 7
M Noch eins: TextFeldArray hinzufügen Java Basics - Anfänger-Themen 7
M Zufallszahlen fertig! aber nice to have noch offen Java Basics - Anfänger-Themen 5
C Abfragen, ob Objekt noch existiert Java Basics - Anfänger-Themen 5
A wieviel platz ist noch frei? Java Basics - Anfänger-Themen 2
J objektorientiert - noch immer nicht begriffen Java Basics - Anfänger-Themen 6
A Noch ne kleine Beanshell Frage Java Basics - Anfänger-Themen 7
S Testen ob ein Char Array noch nicht belegt ist! Java Basics - Anfänger-Themen 3
M Testen ob ein Sample noch abgespielt wird Java Basics - Anfänger-Themen 6
N Mittelwert (fast fertig, nur noch 2 fehler ;-) ) Java Basics - Anfänger-Themen 14
N Und noch eine Frage über getRuntime() Java Basics - Anfänger-Themen 4
D Programm läuft - trotzdem noch ein Fehler drin. Java Basics - Anfänger-Themen 21
G Trotz Abfrage immer noch Zahlen doppelt Java Basics - Anfänger-Themen 3
A Noch ein Anfänger..... Java Basics - Anfänger-Themen 7
M Und noch eine Java Basics - Anfänger-Themen 2
G Fenster maximieren? Suche genutzt geht aber noch nich :( Java Basics - Anfänger-Themen 16
A noch mal bitoperater Java Basics - Anfänger-Themen 2
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben